Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 我试着画一个有纹理的矩形,但我得到的只是一个白色的矩形。为什么?_Objective C_Opengl - Fatal编程技术网

Objective c 我试着画一个有纹理的矩形,但我得到的只是一个白色的矩形。为什么?

Objective c 我试着画一个有纹理的矩形,但我得到的只是一个白色的矩形。为什么?,objective-c,opengl,Objective C,Opengl,我正在尝试使用一点OpenGL。在玩了一会儿之后,我能够画出彩色的几何形状。现在,我想在这些形状上添加纹理 所以,我创建了一个纹理。它似乎被创造好了。然后我试着画它,但我得到的只是一个白色的长方形 这段代码实际上分布在NSOpenGLView的三种方法中,但为了节省空间,我将其全部放在一个代码块中 // ----- Set up OpenGL (this code is adapted from the NeHe OpenGL tutorial) ----- GLuint textureNam

我正在尝试使用一点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()
s,但似乎没有发生错误

为什么我的纹理没有显示出来?如有任何提示,将不胜感激

编辑:

如果我用
glEnable(GL\u texture\u 2D)
glDisable(GL\u texture\u 2D)
包围绘图代码,纹理绘制得很好。但我已经在设置代码中这样做了。为什么我还要再做一次

如果我用glEnable(GL_texture_2D)和glDisable(GL_texture_2D)包围绘图代码,纹理绘制得很好。但我已经在设置代码中这样做了

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

为什么我还要再做一次


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

我觉得代码很好。尝试在调试器中单步执行,以检查是否实际调用了glTexImage2D函数,以及位图(宽度、高度等)是否符合预期。glTexImage2D是否返回GL_NO_ERROR?没有任何错误发生
glTexImage2D
被明确调用,并且输出似乎正确。我还检查了数据数组是否包含正确的像素数据。根据您的编辑-调用设置代码时是否存在OpenGL视图(上下文)?@BrettHale我希望如此。我使用的是
NSOpenGLView
,在
awakeFromNib
期间调用设置代码。此时,我认为
NSOpenGLView
已经完成了自己的加载过程。