从RGB创建纹理

时间:2013-12-30 13:19:56

标签: qt opengl qt4 qt5

我通过网络收到一个屏幕截图Palette。接下来,我使用包含不同颜色的矩阵将Palette指数转换为相关的RGB。

我对代码的问题是我无法使用我成功收到的RGB图像创建纹理。

oid GlWidget::createTextureFromBitmap(QByteArray btmp)
{
 tex.buf = new unsigned char[bytes.size()];
memcpy(tex.buf, bytes.constData(), bytes.size());
glGenTextures( 1, &tex.id);
glBindTexture(GL_TEXTURE_2D, tex.id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(     GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, tex.buf);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, 800, 600, GL_RGB, GL_UNSIGNED_BYTE, tex.buf);
delete [] tex.buf;
tex.buf = NULL;

updateGL();
}

void GlWidget::paintGL()
{
 shaderProgram.bind();
shaderProgram.setUniformValue("mvpMatrix", pMatrix * vMatrix * mMatrix);
shaderProgram.setUniformValue("texture", 0);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex.id);
//glActiveTexture(0);

shaderProgram.setAttributeArray("vertex", vertices.constData());
shaderProgram.enableAttributeArray("vertex");
shaderProgram.setAttributeArray("textureCoordinate", textureCoordinates.constData());
shaderProgram.enableAttributeArray("textureCoordinate");

glDrawArrays(GL_TRIANGLES, 0, vertices.size());

shaderProgram.disableAttributeArray("vertex");
shaderProgram.disableAttributeArray("textureCoordinate");
shaderProgram.release();
}

2 个答案:

答案 0 :(得分:1)

  glTexImage2D(     GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 0, GL_RGB, GL_3_BYTES, tex.buf);
  gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, 800, 600, GL_RGB, GL_3_BYTES, tex.buf);

GL_3_BYTES此处不是有效的数据类型,您可以表示GL_UNSIGNED_BYTE。除此之外,这里还有一些冗余电话。您的glTexImage2D调用将指定mipmap级别0的数据,gluBuild2DMipmaps将指定所有mipmap级别,包括 0.由于您使用mipmapping,因此您只需要后者那些电话。但由于数据类型错误,两个调用都会因GL_INVALID_ENUM而失败,因此您不会有任何纹理。所以你可以通过以下方式替换这两行:

gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, 800, 600, GL_RGB, GL_UNSIGNED_BYTE, tex.buf);

另一件事:

glActiveTexture(0);

这也无效。只有GL_TEXTUREn值对该调用有效。你也不需要"禁用"您可以尝试在此处执行活动纹理选择器。 总是指向一些有效的纹理单元。

答案 1 :(得分:1)

除了上面提到的修复之外,您还可以通过不再执行额外的memcopy(代码中的1,GL驱动中的1),通过将调色板也作为纹理发送,然后执行相同的索引来提高性能您在着色器代码内的CPU代码中执行的操作。此外,如果您仍然设置bytes[]数组,则无需先清除阵列。