gpt4 book ai didi

objective-c - 我尝试绘制一个带有纹理的矩形,但我得到的只是一个白色矩形。为什么?

转载 作者:搜寻专家 更新时间:2023-10-30 20:26:30 25 4
gpt4 key购买 nike

我正在尝试使用一些 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) 包围绘图代码,纹理就绘制得很好。但我已经在设置代码中做到了。为什么我必须再做一次?

最佳答案

The texture is drawn fine if I surround the drawing code with glEnable(GL_TEXTURE_2D) and glDisable(GL_TEXTURE_2D). But I did that in the set up code already.

我会建议,但你已经发现了。

Why do I have to do it again?

因为OpenGL是一个状态机,实际上OpenGL中没有“一次性初始化”这样的东西。可以随时启用和禁用功能。因此,推荐的做法是将所有 OpenGL 操作保留在显示例程中。这包括设置投影、启用所需的功能。

关于objective-c - 我尝试绘制一个带有纹理的矩形,但我得到的只是一个白色矩形。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7993052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com