因此,我查看了本網站和其他人的所有類似問題,但未能找到我的紋理無法加載的答案。我確定紋理是正確讀取的,但是,它只是沒有正確應用。這裏是我的代碼:顯示的是OpenGL實體顏色而不是紋理
獲取質地:
glGenTextures(NumTextures, textures);
glActiveTexture(GL_TEXTURE0);
// load and bind tree texture
readPPM6("textures/tree_trunk.pbm", treeTex);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 128, 128, 0, GL_RGB,
GL_UNSIGNED_BYTE, treeTex);
綁定對象:
繪製樹:
glUseProgram(texture);
proj_loc = glGetUniformLocation(texture, "projection");
model_view_loc = glGetUniformLocation(texture, "modelview");
glUniformMatrix4fv(proj_loc, 1, GL_TRUE, projmat);
glUniformMatrix4fv(model_view_loc, 1, GL_TRUE, modelmat);
glEnable(GL_PRIMITIVE_RESTART);
glPrimitiveRestartIndex(0xFFFF);
glBindVertexArray(vArrays[TreeA]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vElements[TreeE]);
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glDrawElements(GL_TRIANGLE_STRIP, treeIndices.size(), GL_UNSIGNED_SHORT, NULL);
glDisable(GL_PRIMITIVE_RESTART);
glDisable(GL_TEXTURE_2D);
glUseProgram(0);
glBindVertexArray(0);
樹的創建方式:
getCylinderVertices(treeVertices, 10.0, 3.0, 10);
getCylinderIndices(treeIndices, 10);
getConeVertices(treeVertices, 10.0, 15.0, 6.0, 10);
for (int i = 0; i < 10; i++)
{
treeIndices.push_back(60+i*3);
treeIndices.push_back(60+i*3+1);
treeIndices.push_back(60+i*3+2);
treeIndices.push_back(0xFFFF);
}
treeTexCoords = new vec2[90];
for (int i = 0; i < 10; i++)
{
treeTexCoords[i*6] = vec2(0.0, 0.0);
treeTexCoords[i*6+1] = vec2(0.0, 0.2);
treeTexCoords[i*6+2] = vec2(0.0, 0.0);
treeTexCoords[i*6+3] = vec2(1.0, 0.2);
treeTexCoords[i*6+4] = vec2(1.0, 0.0);
treeTexCoords[i*6+5] = vec2(0.0, 0.0);
}
for (int i = 0; i < 30; i++)
{
treeTexCoords[60+i] = vec2(0.0,0.0);
}
頂點着色器:
#version 330 core
attribute vec4 vPosition;
uniform mat4 projection;
uniform mat4 modelview;
attribute vec4 vertex;
attribute vec3 normal;
attribute vec2 vTexCoord;
out vec2 texCoord;
void main()
{
texCoord = vTexCoord;
gl_Position = projection*modelview*vPosition;
}
片段着色器:
#version 330 core
in vec2 texCoord;
uniform sampler2D texture;
void main()
{
gl_FragColor = texture2D(texture, texCoord);
}
固定緩衝子數據分配問題之後,這是樹木如何看待目前的樣子: http://i.imgur.com/dMBq9xN.jpg
僅供參考此是我正在使用的圖像: http://i.imgur.com/QuuQQ5i.jpg
我已經解決了最後的問題,讀者正在讀取一個作爲圖像一部分的末端,因此一切都轉移到了下一個顏色。感謝大家的幫助。
如果更改tree_trunk.pbm圖像,樹的顏色是否更改?以確保文件本身在着色器中被加載和使用)。 此外,請嘗試更改片段着色器以顯示uv,以確保texCoords正確設置:gl_FragColor = vec4(texCoord.x,texCoord.y,1.0,1.0); – biskitt
圖像改變時顏色會改變。當我改變碎片顏色時,你建議一切都變成藍色。所以,不知何故,我猜所有u,v被設置爲0.0,0.0或者紋理座標不會被創建。我怎樣才能確保座標設置正確? – user1800978
您是否嘗試從着色器中刪除未使用的「頂點」和「正常」屬性? –