c - OpenGL 纹理渲染

标签 c opengl textures render

我在 OpenGL 中渲染纹理时遇到问题。我得到的是白色而不是纹理图像,但我的矩形和整个上下文工作正常。我正在使用 stbi 图像加载库和 OpenGL 3.3。

渲染前:

glViewport(0, 0, ScreenWidth, ScreenHeight);

glClearColor(0.2f, 0.0f, 0.0f, 1.0f);

int Buffer;
glGenBuffers(1, &Buffer);
glBindBuffer(GL_ARRAY_BUFFER, Buffer);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

加载纹理:

unsigned char *ImageData = stbi_load(file_name, 1024, 1024, 0, 4); //not sure about the "0" parameter

int Texture;
glGenTextures(1, &Texture);
glBindTexture(GL_TEXTURE_2D, Texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, x, y, 0, GL_RGB, GL_UNSIGNED_BYTE, ImageData);

stbi_image_free(ImageData);

渲染:

glClear(GL_COLOR_BUFFER_BIT);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, Texture);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 6 * 3); //a rectangle which is rendered fine
glDisableVertexAttribArray(0);

我正在寻找一个非常简约和简单的解决方案。

最佳答案

首先,花点时间看一下stbi_load (...)的函数声明:

unsigned char *stbi_load (char const *filename,
                          int        *x,    // POINTER!!
                          int        *y,    // POINTER!!
                          int        *comp, // POINTER!!
                          int         req_comp)

现在,考虑一下您传递给它的参数:

file_name (presumably a pointer to a C string)
1024      (definitely NOT a pointer)
1024      (definitely NOT a pointer)
0         (definitely NOT a pointer)

xycomp 作为指针传递的全部意义在于,stbi 可以在加载图像后更新它们的值。这相当于在 C++ 或 Java 等语言中通过引用传递,但您选择传递整数常量,然后编译器将其视为地址。

由于您调用此函数的方式,stbi 尝试将图像的宽度存储在地址:1024,图像的高度存储在地址:1024以及地址处的组件数量:0。您实际上很幸运,这不会在运行时导致访问冲突或其他奇怪的行为,将内容存储在任意地址是危险的。

相反,考虑一下:

GLuint ImageX,
       ImageY,
       ImageComponents;

GLubyte *ImageData = stbi_load(file_name, &ImageX, &ImageY, &ImageComponents, 4);

[...]

glTexImage2D (GL_TEXTURE_2D,    0, GL_RGBA8,
                ImageX, ImageY, 0, GL_RGBA, GL_UNSIGNED_BYTE, ImageData);

// ~~~~ You are requesting 4 components per-pixel from stbi, so this is RGBA!

关于c - OpenGL 纹理渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20485952/

相关文章:

OpenGL - 采样器阵列限制?

wpf - 避免 3D 圆柱模型中的接缝

opengl - 是否可以将 OpenCV GpuMat 绑定(bind)为 OpenGL 纹理?

c - 将字符加载到动态分配的二维数组中

c - 警告 : passing argument 2 of ‘memcpy’ makes pointer from integer without a cast [enabled by default]

arrays - 使用指针扩展 C 中的数组

c++ - 关于direct3d关于D3DXCreateTextureFromFileEx的方法

C:如何按其元素之一对结构进行排序?不能使用指针

c++ - 如何在 Visual Studio 界面中创建 "Shader"文件夹

opengl - 如何修复透视投影失真?