我工作在C++此刻2D引擎。的OpenGL 3.2纹理问题
我遇到了一个我似乎相信我曾遇到过的问题,但之后却忘记了我是如何修复它的。
该引擎是跨平台(Win,OSX,Linux),为了实现这一点,我使用GLFW作为基础。
在做正常的事情纹理我结束了这一点:
正如你所看到的纹理是不正确(如图像应该是我的一个简单的图像)。
使用gedebugger我可以确认图像被缓存到GPU是正确的,但它有一些如何在图像中看到结尾。
我会在下面介绍一些相关代码,但是如果您希望获得更多信息,请随时提问。
- 缓冲代码
glGenVertexArrays(1, &_vao);
// Generate Buffers and so on.
glBindVertexArray(_vao);
glGenBuffers(1, &_vboVertices);
glBindBuffer(GL_ARRAY_BUFFER, _vboVertices);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * _numVertices, _vertices, GL_STATIC_DRAW);
glGenBuffers(1, &_vboTexCoords);
glBindBuffer(GL_ARRAY_BUFFER, _vboTexCoords);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 2 * _numVertices, _texCoords, GL_STATIC_DRAW);
glGenBuffers(1, &_vboIndices);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboIndices);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLint) * _numIndices, _indices, GL_STATIC_DRAW);
-Render代码
glm::mat4 modelViewProjMatrix = projMatrix * viewMatrix * modelMatrix;
ShaderResource * shader = ShaderManager::GetInstance()->GetShader(_shaderName.c_str());
TextureResource * texture = TextureManager::GetInstance()->GetTexture(_textureName.c_str());
shader->BindShader();
// Bind VAO
glBindVertexArray(_vao);
// Bind all VBO's
glBindBuffer(GL_ARRAY_BUFFER, _vboVertices);
GLint posLocation = shader->GetAttribLocation("in_position");
glVertexAttribPointer(posLocation, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
GLint texCoordLocation = shader->GetAttribLocation("in_texCoord");
glVertexAttribPointer(texCoordLocation, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboIndices);
// Enable VBO Pointers
glEnableVertexAttribArray(posLocation);
glEnableVertexAttribArray(texCoordLocation);
// Find and assign Uniforms
GLint MVPMatrixLocation = shader->GetUniformLocation("in_MVPMatrix");
GLint colourLocation = shader->GetUniformLocation("in_colour");
GLint textureLocation = shader->GetUniformLocation("texMap");
glUniformMatrix4fv(MVPMatrixLocation, 1, GL_FALSE, glm::value_ptr(modelViewProjMatrix));
glUniform4fv(colourLocation, 1, glm::value_ptr(_colour));
// Texture Uniform
if(texture != 0)
{
glActiveTexture(GL_TEXTURE0);
glUniform1i(textureLocation, 0);
glBindTexture(GL_TEXTURE_2D, texture->GetTextureId());
}
glDrawElements(GL_TRIANGLES, _numIndices, GL_UNSIGNED_INT, (void*) 0);
glDisableVertexAttribArray(posLocation);
glDisableVertexAttribArray(texCoordLocation);
shader->UnbindShader();
glBindVertexArray(0);
-Vert着色
#version 150
in vec3 in_position;
in vec2 in_texCoord;
out vec4 out_colour;
smooth out vec2 out_texCoord;
uniform vec4 in_colour;
uniform mat4 in_MVPMatrix;
void main()
{
out_colour = in_colour;
out_texCoord = in_texCoord;
gl_Position = in_MVPMatrix * vec4(in_position, 1.0);
}
-Frag着色
#version 150
in vec4 out_colour;
smooth in vec2 out_texCoord;
out vec4 fragColor;
uniform sampler2D texMap;
void main()
{
vec4 diffuseTexel = texture2D(texMap, out_texCoord);
fragColor = out_colour * diffuseTexel;
}
谢谢你的答案!!,这两个都是对的,虽然我接受了第一个,但对我来说这是一个完全愚蠢的疏忽:/压抑我花了几个小时试图解决这个问题......我需要睡觉。 – OpticFroggy 2012-07-25 21:30:41