【发布时间】:2014-01-28 15:00:28
【问题描述】:
我目前正在尝试使用 libpng 加载 png 图像,然后将其转换为 OpenGL 纹理,然后进行绘制。
现在,首先,做一个快速测试,看看是否有任何纹理会被绘制一个简单的测试四边形,我制作了这个纹理:
glGenTextures(1, &textureHandle);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureHandle);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, 4, 4);
const GLubyte myTexture[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_UNSIGNED_BYTE, myTexture);
只是一个白色纹理,然后在我的四边形上绘制。这完美地工作。因此,它似乎表明片段着色器和顶点着色器以及我的其他绘图逻辑工作正常。
对于任何感兴趣的人,这是使用纹理进行绘图的主循环:
glClearColor(1, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(theProgram);
GLuint samplerLoc = glGetUniformLocation(theProgram, "tex");
if (samplerLoc == -1)
printf("Location name could not be found...\n");
glUniform1i(samplerLoc, 0);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(16 * sizeof(float)));
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
现在,我使用 libpng 从 png 加载 OpenGL 纹理的函数是:OpenGL Texture Load Function
我提供链接的原因是为了让这篇文章不会变得无法阅读:)
基本上,我加载纹理并绑定它的代码部分是这样的:
GLuint myImage = png_texture_load("niks.png", &width, &height);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, myImage);
GLuint mySampler;
glGenSamplers(1, &mySampler);
glBindSampler(0, mySampler);
这发生在主循环之前。
还值得注意的是,我已经使用 glGetError 函数进行了广泛的调试,并且它根本没有返回任何错误。此外,我已经逐步完成了 png_texture_load 函数,它成功返回了 OpenGL 纹理。
另外,我正在加载的图像是 2 的幂。它的尺寸为 64x64。
我似乎完全不知道为什么,当我自己的文本纹理显示得很好时,它只是一个黑色纹理?
编辑
这是从加载的数据创建纹理的 libpng 图像函数的一部分:
// Generate the OpenGL texture object
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, format, temp_width, temp_height, 0, format, GL_UNSIGNED_BYTE, image_data);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, temp_width, temp_height, GL_RGB, GL_UNSIGNED_BYTE, image_data);
【问题讨论】:
-
我实际上没有图像的 glTexSubImage !我只是尝试添加它,但它似乎没有改变任何东西。我通过添加 glTexSubImage 编辑了原始问题。
-
可能会更改 4x4 测试纹理中的几个字节以确保确定。
-
我已经这样做了 :) 更改了几个字节以查看是否会显示任何颜色,确实如此。我应该提到这一点,但感谢您的建议
-
白色对于纹理来说是一个糟糕的测试图像,因为加载不当的 OpenGL 纹理对象将默认生成白色像素。
标签: c++ opengl textures shader libpng