输出纹理不是来自代码

时间:2013-10-05 17:30:27

标签: opengl

有人可以告诉我在给定代码中我做错了什么,因为我没有得到任何纹理

float pixels[] = {
0.0f, 0.0f, 0.0f,   1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,   0.0f, 0.0f, 0.0f
};
GLint texture;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_FLOAT, pixels);
glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture );
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

1 个答案:

答案 0 :(得分:0)

glTexImage2D (...)将纹理图像数据提供给当前绑定的纹理名称。代码的问题在于,在生成和绑定纹理名称(texture)之前上传纹理图像数据。

解决方案非常简单:

/* Use a GLuint for OpenGL handles by the way */
GLuint texture;

glGenTextures (1, &texture);
glBindTexture (GL_TEXTURE_2D, texture);

/* After creating a texture name, and binding it, you have a valid context for
 *   the following API call.
 */
glTexImage2D  (GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_FLOAT, pixels);

为了更快地上传图像,您应该考虑使用基于整数的数据类型将数据存储在C代码中。当您创建GL_RGB纹理时,OpenGL通常会创建一个纹理,每个通道使用8位定点,glTexImage2D (...)在上传图像数据时进行像素数据转换。这称为像素传输转换,当您使用具有不同通道布局或基本数据类型的内部格式和像素传输格式时,它会增加glReadPixels (...)glTexImage2D (...)等内容的驱动程序开销。

更新版本的OpenGL甚至允许您指定内部使用的确切格式,因此如果要保证8位定点,可以使用GL_RGB8作为内部格式。将此与GL_RGBGL_UNSIGNED_BYTE相结合进行像素传输将使您进入快速路径",并使您的代码在OpenGL和OpenGL ES之间更加轻松(不允许)像素传输转换)。

值得一提的是,RGB8首先不是格式的好选择,驱动程序几乎肯定会将其填充到RGBx8以满足硬件上的二次幂对齐要求。由于最终存在额外的8位无法使用的存储空间,因此RGBA8最终可以更好地工作,并且通过使用RGB图像格式可以更清晰地保存任何内存。只有少数3通道格式(例如GL_R11F_G11F_B10F​)实际上使用与其组件总和相同的存储量,1通道,2通道和4通道图像格式通常是通过去。