我正在尝试使用一些OpenGL。在玩了一会儿后,我能够绘制彩色几何形状。现在,我想在这些形状上加上纹理。
所以,我创建了一个纹理。它似乎创造得很好。然后我尝试绘制它,但我得到的只是一个白色矩形。
代码实际上分布在NSOpenGLView
的三个方法中,但为了节省空间,我把它全部放在一个代码块中。
// ----- Set up OpenGL (this code is adapted from the NeHe OpenGL tutorial) -----
GLuint textureName = 0;
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
// ----- I load the image: (This code is adapted from some sample code from Apple) -----
NSImage *image = dataSource.image; // get the original image
NSBitmapImageRep* bitmap = [NSBitmapImageRep alloc];
[image lockFocus];
[bitmap initWithFocusedViewRect:
NSMakeRect(0.0, 0.0, image.size.width, image.size.height)];
[image unlockFocus];
// Set proper unpacking row length for bitmap.
glPixelStorei(GL_UNPACK_ROW_LENGTH, bitmap.pixelsWide);
// Set byte aligned unpacking (needed for 3 byte per pixel bitmaps).
if (bitmap.samplesPerPixel == 3) {
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
}
// Generate a new texture name if one was not provided.
if (textureName == 0)
glGenTextures (1, &textureName);
glBindTexture (GL_TEXTURE_2D, textureName);
// Non-mipmap filtering (redundant for texture_rectangle).
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// RGB 24 bit bitmap, or RGBA 32 bit bitmap
if(bitmap.samplesPerPixel == 3 || bitmap.samplesPerPixel == 4) {
glTexImage2D(GL_TEXTURE_2D, 0,
bitmap.samplesPerPixel == 4 ? GL_RGBA8 : GL_RGB8,
bitmap.pixelsWide,
bitmap.pixelsHigh,
0,
bitmap.samplesPerPixel == 4 ? GL_RGBA : GL_RGB,
GL_UNSIGNED_BYTE,
bitmap.bitmapData);
}
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
[bitmap release];
// ----- Drawing code (This code is adapted from the NeHe OpenGL tutorial) -----
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
if (textureName) {
glBindTexture(GL_TEXTURE_2D, textureName);
glBegin(GL_QUADS);
{
glTexCoord2f(1.0, 0.0); glVertex3f( 0.5, -0.5, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f( 0.5, 0.5, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-0.5, 0.5, 0.0);
glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, -0.5, 0.0);
}
glEnd();
}
glFlush();
唉,我得到的只是一个黑色的黑色大小的白色矩形。
我也试过在这里和那里插入一些glGetError()
,但似乎没有发生错误。
为什么我的纹理不显示?任何提示都将不胜感激。
修改
如果我用glEnable(GL_TEXTURE_2D)
和glDisable(GL_TEXTURE_2D)
包围绘图代码,纹理就会被绘制得很好。但我已经在设置代码中这样做了。为什么我要再做一次?
答案 0 :(得分:1)
如果用glEnable(GL_TEXTURE_2D)和glDisable(GL_TEXTURE_2D)包围绘图代码,纹理就会被绘制得很好。但我已经在设置代码中这样做了。
我会建议,但你已经发现了。
为什么我要再做一次?
因为OpenGL是一个状态机,实际上在OpenGL中没有“一次初始化”之类的东西。可以随时启用和禁用功能。因此,建议的做法是在显示例程中保持所有 OpenGL操作。这包括设置投影,启用所需的功能。