[英]Trying to display a texture but only getting a solid color with OpenGL
我的目標是顯示一個具有從png文件(DarkDirt.png)提取的紋理的多維數據集。 問題是,我只能得到純棕色,並且照明會隨着形成立方體的每個三角形而變化。
現在,我一直在閱讀,我想這可能與將索引設置為1有關,但是我沒有獲得任何成功。 我嘗試使用UV值,但是它只會改變照明的行為方式,不會解決任何問題。 所以現在我在想也許我的頂點(代碼中的頂點)是錯誤的?
C ++代碼,數組:
const GLuint NumVertices = 24;
const GLuint NumTriCubes = 12;
const GLuint NumNormals = 6;
const GLuint NumUvs = 4;
GLfloat uvs[NumUvs][2] = {
{ 0, 0 },
{ 1, 0 },
{ 0, 1 },
{ 1, 1 },
};
GLfloat vertices[NumVertices][3] = {
//Front
{ -0.5f, -0.5f, 0.5f }, //0
{ 0.5f, -0.5f, 0.5f }, //1
{ 0.5f, 0.5f, 0.5f }, //2
{ -0.5f, 0.5f, 0.5f }, //3
//Right
{ 0.5f, -0.5f, 0.5f }, //4
{ 0.5f, -0.5f, -0.5f }, //5
{ 0.5f, 0.5f, -0.5f }, //6
{ 0.5f, 0.5f, 0.5f }, //7
//Back
{ -0.5f, -0.5f, -0.5f }, //8
{ -0.5f, 0.5f, -0.5f }, //9
{ 0.5f, 0.5f, -0.5f }, //10
{ 0.5f, -0.5f, -0.5f }, //11
//Left
{ -0.5f, -0.5f, 0.5f }, //12
{ -0.5f, 0.5f, 0.5f }, //13
{ -0.5f, 0.5f, -0.5f }, //14
{ -0.5f, -0.5f, -0.5f }, //15
//Upper
{ -0.5f, 0.5f, 0.5f }, //16
{ 0.5f, 0.5f, 0.5f }, //17
{ 0.5f, 0.5f, -0.5f }, //18
{ -0.5f, 0.5f, -0.5f }, //19
//Bottom
{ -0.5f, -0.5f, 0.5f }, //20
{ -0.5f, -0.5f, -0.5f }, //21
{ 0.5f, -0.5f, -0.5f }, //22
{ 0.5f, -0.5f, 0.5f }, //23
};
GLuint vertexIndices[NumTriCubes][3] = {
//Front
{ 0, 1, 2 },
{ 0, 2, 3 },
//Right
{ 4, 5, 6 },
{ 4, 6, 7 },
//Back
{ 8, 9, 10 },
{ 8, 10, 11 },
//Left
{ 12, 13, 14 },
{ 12, 14, 15 },
//Upper
{ 16, 17, 18 },
{ 16, 18, 19 },
//Bottom
{ 20, 21, 22 },
{ 20, 22, 23 }
};
GLfloat normals[NumVertices][3] = {
//Front
{ 0.0f, 0.0f, 1.0f},
{ 0.0f, 0.0f, 1.0f},
{ 0.0f, 0.0f, 1.0f},
{ 0.0f, 0.0f, 1.0f},
//Right
{ 1.0f, 0.0f, 0.0f},
{ 1.0f, 0.0f, 0.0f},
{ 1.0f, 0.0f, 0.0f},
{ 1.0f, 0.0f, 0.0f},
//Back
{ 0.0f, 0.0f, -1.0f},
{ 0.0f, 0.0f, -1.0f},
{ 0.0f, 0.0f, -1.0f},
{ 0.0f, 0.0f, -1.0f},
//Left
{ -1.0f, 0.0f, 0.0f},
{ -1.0f, 0.0f, 0.0f},
{ -1.0f, 0.0f, 0.0f},
{ -1.0f, 0.0f, 0.0f},
//Upper
{ 0.0f, 1.0f, 0.0f},
{ 0.0f, 1.0f, 0.0f},
{ 0.0f, 1.0f, 0.0f},
{ 0.0f, 1.0f, 0.0f},
//Bottom
{ 0.0f, -1.0f, 0.0f},
{ 0.0f, -1.0f, 0.0f},
{ 0.0f, -1.0f, 0.0f},
{ 0.0f, -1.0f, 0.0f}
};
C ++代碼,我將紋理綁定到draw()函數中:
m_texture->bind();
C ++代碼,初始化:
glGenBuffers(NumBuffers, m_Buffers);
glBindBuffer(GL_ARRAY_BUFFER, m_Buffers[VBO_Cube]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices)+ sizeof(uvs) + sizeof(normals), nullptr, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(uvs), uvs);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(uvs), sizeof(normals), normals);
...
glEnableVertexAttribArray(GLuint(m_vNormalLocation));
glVertexAttribPointer(GLuint(m_vNormalLocation), 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(vertices)));
glVertexAttribPointer(GLuint(m_vUVLocation), 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(vertices)));
glEnableVertexAttribArray(GLuint(m_vUVLocation));
...
m_texture = new QOpenGLTexture(QImage("DarkDirt.png").mirrored());
m_texture->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
m_texture->setMagnificationFilter(QOpenGLTexture::Linear);
我試圖使紋理顯示在多維數據集的每一側。 因此它會給我一個“污垢立方體”,例如在我的世界中。 但是,是的,現在它只顯示為一個實心的棕色立方體,周圍到處都是照明。 任何幫助將不勝感激。 謝謝!
每個頂點坐標都需要一個紋理坐標屬性。 由於您具有24(4 * 6)個頂點坐標,因此也需要24個紋理坐標屬性:
const GLuint NumUvs = 24;
GLfloat uvs[NumUvs][2] = {
{ 0, 0 }, { 1, 0 }, { 0, 1 }, { 1, 1 },
{ 0, 0 }, { 1, 0 }, { 0, 1 }, { 1, 1 },
{ 0, 0 }, { 1, 0 }, { 0, 1 }, { 1, 1 },
{ 0, 0 }, { 1, 0 }, { 0, 1 }, { 1, 1 },
{ 0, 0 }, { 1, 0 }, { 0, 1 }, { 1, 1 },
{ 0, 0 }, { 1, 0 }, { 0, 1 }, { 1, 1 }
};
法向矢量偏移量的計算錯誤:
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(uvs), uvs); glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(uvs), sizeof(normals), normals); glVertexAttribPointer(GLuint(m_vNormalLocation), 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(vertices)));
它一定要是:
glVertexAttribPointer(GLuint(m_vNormalLocation), 3, GL_FLOAT, GL_FALSE, 0,
BUFFER_OFFSET(sizeof(vertices) + sizeof(uvs)));
似乎從未在程序中設置紋理坐標的屬性索引( m_vUVLocation
)。
您可以通過QOpenGLShaderProgram::attributeLocation
獲取屬性的屬性索引:
m_vUVLocation = m_programRender->attributeLocation("vUV");
或由glGetAttribLocation
原生OpenGL:
m_vUVLocation = glGetAttribLocation(m_programRender->programId(), "vUV");
注意,也可以使用GLSL布局限定符在着色器代碼中定義屬性位置:
例如,頂點着色器:
#version 400 core
layout(location = 0) in vec4 vPosition;
layout(location = 1) in vec4 vColor;
layout(location = 2) in vec3 vNormal;
layout(location = 3) in vec2 vUV;
在這種情況下, m_vUVLocation
的值為3。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.