2013-12-18 37 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