Простой пример того, как нарисовать квадрат с текстурой, используя Tao.Framework
Я пытаюсь построить простой тест OpenGL
с помощью Tao.Framework
, Мне нужно нарисовать квадрат с текстурой. Пока я дошел до этого:
private void simpleOpenGlControl1_Paint(object sender, PaintEventArgs e)
{
simpleOpenGlControl1.InitializeContexts();
Gl.glClearColor(0f, 0f, 0f, 0f);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
Gl.glOrtho(-1, 2, -1, 2, 1, -1);
// Open image
var fileName = @"C:\mypath\image.bmp";
var bmp = new Bitmap(fileName);
var bmpData = bmp.LockBits(
new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadOnly,
PixelFormat.Format24bppRgb);
// Texture
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, (int)Gl.GL_RGB8,
bmp.Width, bmp.Height, 0, Gl.GL_BGR_EXT,
Gl.GL_UNSIGNED_BYTE, bmpData.Scan0);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);
// Draw a square.
Gl.glBegin(Gl.GL_POLYGON);
Gl.glVertex2f(0, 0);
Gl.glVertex2f(0, 1);
Gl.glVertex2f(1, 1);
Gl.glVertex2f(1, 0);
Gl.glEnd();
}
Квадрат отображается в ожидаемой форме, но без текстуры. Я новичок в OpenGL
еще больше в Tao.Framework
, Как я могу это исправить? Или как правильно добавить текстуру?
РЕДАКТИРОВАНИЕ
С помощью @jp я пытаюсь это:
//...
Gl.glEnable(Gl.GL_TEXTURE_2D);
// Draw a square.
Gl.glBegin(Gl.GL_POLYGON);
Gl.glTexCoord2f(0, 0); Gl.glVertex2f(0, 0);
Gl.glTexCoord2f(0, 1); Gl.glVertex2f(0, 1);
Gl.glTexCoord2f(1, 1); Gl.glVertex2f(1, 1);
Gl.glTexCoord2f(1, 0); Gl.glVertex2f(1, 0);
Gl.glEnd();
Но квадрат держится без текстуры.
1 ответ
Ты скучаешь по крайней мере
GL.Enable(GL.TEXTURE2D);
который не включен по умолчанию.
Также вам нужно сгенерировать новый слот текстуры, вызвав:
int texID;
Gl.glGenTextures(1, texID); //where 1 is the count, and texID a new texture slot in the gpu
Затем вы должны привязать тот слот текстуры, к которому будут применяться все дальнейшие операции.
Gl.glBindTexture(Gl.GL_TEXTURE_2D, texID);
обратите внимание, что вызов Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0); отключить текущую текстуру.
теперь все дальнейшие операции направлены на эту текстуру, так что теперь вы можете передать свои растровые данные в этот слот текстуры, вызвав:
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, (int)Gl.GL_RGB8,
bmp.Width, bmp.Height, 0, Gl.GL_BGR_EXT,
Gl.GL_UNSIGNED_BYTE, bmpData.Scan0);
если вы хотите установить некоторые параметры текстуры, такие как texGen и зажим, и многое другое, вы делаете это здесь, например:
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
Ваше объявление вершины также должно включать некоторую текстурную координату, или вы должны активировать генерацию координат текстуры.
GL.TexCoord(0,1); Gl.glVertex2f(0, 0);
GL.TexCoord(0,0); Gl.glVertex2f(0, 1);
GL.TexCoord(1,0); Gl.glVertex2f(1, 1);
GL.TexCoord(1,1); Gl.glVertex2f(1, 0);
если вы хотите, чтобы эти координаты генерировались автоматически, вы можете опустить вызов GL.TexCoord и включить его через:
Gl.glEnable(Gl.GL_TEXTURE_GEN_S); //enable texture coordinate generation
Gl.glEnable(Gl.GL_TEXTURE_GEN_T);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP);
Не забудьте разблокировать ваши растровые данные (даже если сборщик мусора является обязательным):
bmp.Unlock(bmpData);