2015-05-18 88 views
0

我正在做一些与opengl测试,并试图绘制一个红色的矩形。这是代码:为什么此代码在OpenGL中打印白色矩形而不是红色?

qDebug(__FUNCTION__); 
float *rgbImage = (float *)malloc(width * height * 3 * sizeof(float)); 
float *rgbImagePtr = rgbImage; 

qDebug("Initializing"); 
int y, x; 
for(y = 0; y < height; y++) 
{ 
    for(x = 0; x < width; x++) 
    { 
     *rgbImagePtr++ = 255; // R 
     *rgbImagePtr++ = 0; // G 
     *rgbImagePtr++ = 0; // B 
    } 
} 

// Generate false image 

qDebug("Creating texture"); 
GLuint texture; 
glGenTextures(1, &texture); 

glBindTexture(GL_TEXTURE_2D, texture); 
qDebug("drawing image"); 

glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_FLOAT, rgbImage); 
qDebug("drawing image finished"); 

当我运行我的例子时,我得到白色矩形而不是红色,因为我知道当我在做什么。有什么问题?

编辑1

glBegin(GL_QUADS); 
glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(256.0f, 0.0f, 0.0f); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(256.0f, 256.0f, 0.0f); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 256.0f, 0.0f); 
glEnd(); 

抽奖代码添加

+1

浮点数据格式应使用在范围0..1范围内归一化的值。 – Luca

+0

您只显示您的纹理绑定代码。您的绘图代码可能存在问题......您可能也想显示该问题。 – MuertoExcobito

+0

@Luca什么是R频道的正确价值呢? – jgd

回答

0

最有可能的问题是,你的纹理被视为不完整,由于缺乏纹理贴图层。您必须关闭纹理的mipmapping或提供完整的mipmap图层。

此外,您似乎没有在激活的纹理单元上启用GL_TEXTURE_2D目标(如果使用固定功能管道,则需要)。

+0

我想我正在关闭mipmapping:'glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);'我错了? – jgd

+0

@jgd:确实这个调用具有所需的效果,但它必须在正确的时间调用(与纹理绑定在一起,取决于驱动程序的错误通常在纹理图像加载后)。 – datenwolf

+0

我试着用它,但结果是一样的。也许我生成的RGB图像不好? – jgd

0

glTexImage2d调用有一个不正确internalFormat参数:

glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_FLOAT, rgbImage); 
           ^-- here 

documentation说,它指定纹理颜色成分的数量,但同时也表示,该值应该在给定的枚举之一页面结尾。

在你的情况下,而不是3,它应该是GL_RGB

+0

实际上,传统GL中明确允许值1到4。 [OpenGL 2.1规范](https://www.opengl.org/registry/doc/glspec21.20061201.pdf),第3.8.1节规定“'internalformat'可以(为了向后兼容GL的1.0版本)分别取等于符号常量'LUMINANCE','LUMINANCE ALPHA','RGB'和'RGBA'的整数值1,2,3和4。 – derhass

+0

哈你说得对,我没有看到。 – Jerem