2013-12-18 36 views
2

因此,我查看了本網站和其他人的所有類似問題,但未能找到我的紋理無法加載的答案。我確定紋理是正確讀取的,但是,它只是沒有正確應用。這裏是我的代碼:顯示的是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

我已經解決了最後的問題,讀者正在讀取一個作爲圖像一部分的末端,因此一切都轉移到了下一個顏色。感謝大家的幫助。

+0

如果更改tree_trunk.pbm圖像,樹的顏色是否更改?以確保文件本身在着色器中被加載和使用)。 此外,請嘗試更改片段着色器以顯示uv,以確保texCoords正確設置:gl_FragColor = vec4(texCoord.x,texCoord.y,1.0,1.0); – biskitt

+0

圖像改變時顏色會改變。當我改變碎片顏色時,你建議一切都變成藍色。所以,不知何故,我猜所有u,v被設置爲0.0,0.0或者紋理座標不會被創建。我怎樣才能確保座標設置正確? – user1800978

+0

您是否嘗試從着色器中刪除未使用的「頂點」和「正常」屬性? –

回答

1

我很驚訝這段代碼不會導致崩潰,sizeof (vec2) * 90是第二次調用glBufferSubData (...)時應該使用的,因爲紋理座標數組中的浮點組件數是您頂點中組件的數量的一半位置數組。當您使用數據填充緩衝區時,您會在客戶端內存中溢出VBO的存儲空間和紋理座標數組。

sizeof (treeTexCoords)絕對不是你想要的,因爲你已經動態分配了這個數組!雖然如果您嘗試使用指向new的內存指針來獲取靜態大小的數組的大小,您可以使用sizeof (...),但您將獲得的只是指針本身的大小。因此,sizeof (treeTexCoords)可能是您的系統上的或。

glBindVertexArray (vArrays [TreeA]); 
glBindBuffer  (GL_ARRAY_BUFFER, vBuffers [TreeB]); 

// 
// @CORRECTION #1 
// 
glBufferData  (GL_ARRAY_BUFFER, sizeof (GLfloat) * treeVertices.size() + 
            sizeof (vec2) * 90, 
             NULL, GL_STATIC_DRAW); 
glBufferSubData (GL_ARRAY_BUFFER, 0, 
            sizeof (GLfloat) * treeVertices.size(), 
             treeVertices.data()); 
// 
// @CORRECTION #2 
// 
glBufferSubData (GL_ARRAY_BUFFER, sizeof (GLfloat) * treeVertices.size(), 
            sizeof (vec2) * 90, 
             treeTexCoords); 

修正#1分配適當的存儲量(而不是爲所有頂點+ 1個指針存儲足夠的空間)。

校正#2只讀取到treeTexCoords的結尾,而不是超出它。

取決於如何聲明treeVertices,可能會有其他問題 - 您是否可以編輯您的問題以顯示treeVertices的聲明?我假設它是類似std::vector <GLfloat>

+0

是的,我昨天已經意識到這個問題並修正了它,是的,treeVertices是一個矢量,我會張貼我現在得到的圖像,也許實際上我讀的圖像有問題。 – user1800978