c++ - OpenGL 纹理未显示

标签 c++ qt opengl textures uv-mapping

当我创建立方体并尝试为其应用纹理时,未应用纹理但 opengl 返回黑色立方体,纹理显示为黑色。 我正在使用 QT,这是代码:

(我正在使用QT)

创建纹理函数:

GLuint AOpenGlWidget::textureFromRsc(QString place){
// Read the bmp file
QImage img(place);
QImage tb;

QImage fixedImage( img.width(), img.height(), QImage::Format_ARGB32);
QPainter painter(&fixedImage);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(fixedImage.rect(), Qt::transparent);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawImage( 0, 0, img);
painter.end();

tb = QGLWidget::convertToGLFormat(fixedImage);

GLuint textureId;
glGenTextures(1,&textureId);
glBindTexture(GL_TEXTURE_2D,textureId);

glTexImage2D(GL_TEXTURE_3D,0,4,tb.width(),tb.height(),0,GL_RGBA,GL_UNSIGNED_BYTE,tb.bits());

if(!tb.bits()){
    QMessageBox::information(0,"Texture loading error.","There was an error while trying to load a texture.");
}

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

return textureId;
}



PaintGl 函数:

void AOpenGlWidget::paintGL(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clears the screen and paint the bg with the color specified on glClearColor



// Another stuff (MVP Matrix... bla bla bla)

glUseProgram(programId);

GLuint MatrixId = glGetUniformLocation(programId,"MVP");
glUniformMatrix4fv(MatrixId,1,GL_FALSE,glm::value_ptr(MVP));
glActiveTexture(cursor_texture);
glBindTexture(GL_TEXTURE_2D,cursor_texture);

glUniform1i(glGetUniformLocation(programId,"textura"),cursor_texture);
// Draw or triangles

glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);   

glBindBuffer(GL_ARRAY_BUFFER,trianglebuffer[0]);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0);


glBindBuffer(GL_ARRAY_BUFFER,trianglebuffer[1]);
glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,0,(void*)0);


glDrawArrays(GL_TRIANGLES,0,12*3);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
}

缓冲区:
三角缓冲区[1](紫外线坐标):

const GLfloat simple_triangle_buffer_txcoord[] = {
     0.0f,0.0f,
     0.0f,1.0f,
     1.0f,1.0f,
     1.0f,1.0f,
     1.0f,0.0f,
     0.0f,0.0f,
    0.0f,0.0f,
     0.0f,1.0f,
     1.0f,1.0f,
     1.0f,1.0f,
     1.0f,0.0f,
     0.0f,0.0f,
     0.0f,0.0f,
     0.0f,1.0f,
     1.0f,1.0f,
     1.0f,1.0f,
     1.0f,0.0f,
     0.0f,0.0f,
     0.0f,0.0f,
     0.0f,1.0f,
     1.0f,1.0f,
     1.0f,1.0f,
     1.0f,0.0f,
     0.0f,0.0f,
     0.0f,0.0f,
     0.0f,1.0f,
     1.0f,1.0f,
     1.0f,1.0f,
     1.0f,0.0f,
     0.0f,0.0f,
     0.0f,0.0f,
     0.0f,1.0f,
     1.0f,1.0f,
     1.0f,1.0f,
     1.0f,0.0f,
     0.0f,0.0f
};

缓冲区:
三角形缓冲区[0](立方体):

const GLfloat simple_triangle_buffer[] = {
    // Front
    -1.0f,1.0f,1.0f,
    -1.0f,-1.0f,1.0f,
    1.0f,-1.0f,1.0f,
    1.0f,-1.0f,1.0f,
    1.0f,1.0f,1.0f,
    -1.0f,1.0f,1.0f,

    // Top
    -1.0f,1.0f,-1.0f,
    -1.0f,1.0f,1.0f,
    1.0f,1.0f,1.0f,
    1.0f,1.0f,1.0f,
    1.0f,1.0f,-1.0f,
    -1.0f,1.0f,-1.0f,

    // Left
    -1.0f,1.0f,1.0f,
    -1.0f,1.0f,-1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f,-1.0f,1.0f,
    -1.0f,1.0f,1.0f,

    // Back
    -1.0f,1.0f,-1.0f,
    -1.0f,-1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f,1.0f,-1.0f,
    -1.0f,1.0f,-1.0f,

    // Bottom
    -1.0f,-1.0f,1.0f,
    1.0f,-1.0f,1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f,-1.0f,-1.0f,
    1.0f,-1.0f,1.0f,
    1.0f,-1.0f,-1.0f,

    // Right
    1.0f,1.0f,1.0f,
    1.0f,-1.0f,1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f,1.0f,-1.0f,
    1.0f,1.0f,1.0f

};

还有着色器(Frag & Vert):

// Fragment
#version 330 core
out vec3 color;
in vec2 thcoord;
in vec2 UV;
uniform sampler2D d_textura;
void main(){
color = texture(d_textura,thcoord).rgb;
}
// Vertex
#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec2 tcoord;
out vec2 thcoord;
uniform mat4 MVP;
void main(){
vec4 v = vec4(vertexPosition_modelspace,1);
thcoord=tcoord;
gl_Position = MVP * v;
}

理解 UV 坐标对我来说有点困难...

最佳答案

你的 glTexImage2D 调用错了吗?

glTexImage2D(GL_TEXTURE_3D,0,4,tb.width(),tb.height(),0,GL_RGBA,GL_UNSIGNED_BYTE,tb.bits()); ?

关于c++ - OpenGL 纹理未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13706112/

相关文章:

c++ - 在打开 vsync 的情况下执行 glTexImage2D 时出现奇怪的延迟

c++ - 如何禁用 GTK 拖放?

c++ - 如何解决这个未声明的标识符

c++ - 在 Qt 中如何在 QLineEdit 中使用 QFileDialog 添加文件

c++ - QUdpSocket。如何获取发件人的IP地址?

opengl - 如何使用 ImageLoad() 访问深度纹理?

c++ - 如何在现代 opengl 中处理正交投影中的照明?

opengl - glDelete* 上的访问冲突

c++ - 从 Visual Studio 属性窗口中删除方法

c++ - 具有虚函数的类占用更多空间