我正在尝试使用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
更是如此。我该如何解决?或者添加纹理的正确方法是什么?
EDITED
在@ j-p的帮助下,我试试这个:
//...
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();
但是正方形没有纹理。
答案 0 :(得分:4)
你至少错过了
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和clamp,还有很多其他东西,你可以在这里做,例如:
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);