【问题标题】:GLSL/OpenGL - Single color instead of the textureGLSL/OpenGL - 单色而不是纹理
【发布时间】:2013-08-25 02:13:13
【问题描述】:

我最近开始学习 GLSL,但现在我遇到了纹理问题。我已经阅读了所有关于它的主题,我发现了同样的问题纯色问题,但是有一个不同的问题导致了这个问题。所以,我有一个简单的四边形(地面),我只想在上面渲染一个草纹理。着色器:

片段:

#version 330

uniform sampler2D color_texture;

in vec4 color;
out vec2 texCoord0;

void main() 
{
gl_FragColor = color+texture(color_texture,texCoord0.st);
}

顶点:

#version 330
uniform mat4 projection_matrix;
uniform mat4 modelview_matrix;

in vec3 a_Vertex;
in vec3 a_Color;
in vec2 a_texCoord0;

out vec4 color;
out vec2 texCoord0;

void main() 
{            
texCoord0 = a_texCoord0;
gl_Position = (projection_matrix * modelview_matrix) * vec4(a_Vertex, 1.0);
color = vec4(a_Color,0.3);
}

我的纹理和原始坐标:

static GLint m_primcoords[12]=
{0,0,0, 
0,0,100,
100,0,100, 
100,0,0};
static GLfloat m_texcoords[8]=
{0.0f,0.0f,
0.0f,1.0f,
1.0f,1.0f,
1.0f,0.0f};

缓冲区:

glBindBuffer(GL_ARRAY_BUFFER,vertexcBuffer);
glBufferData(GL_ARRAY_BUFFER,sizeof(GLint)*12,m_primcoords,GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER,colorBuffer);
glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*12,m_colcoords,GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER,textureBuffer);
glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*8,m_texcoords,GL_STATIC_DRAW);

还有我的渲染方法:

GLfloat modelviewMatrix[16];
GLfloat projectionMatrix[16];

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

cameraMove();

GLuint texturegrass = ploadtexture("grass.BMP");
glBindTexture(GL_TEXTURE_2D, texturegrass);

glGetFloatv(GL_MODELVIEW_MATRIX,modelviewMatrix);
glGetFloatv(GL_PROJECTION_MATRIX,projectionMatrix);

shaderProgram->sendUniform4x4("modelview_matrix",modelviewMatrix);
shaderProgram->sendUniform4x4("projection_matrix",projectionMatrix);

glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);

glActiveTexture(GL_TEXTURE0);
shaderProgram->sendUniform("color_texture",0);

glBindBuffer(GL_ARRAY_BUFFER,colorBuffer);
glVertexAttribPointer((GLint)1,3,GL_FLOAT,GL_FALSE,0,0);

glBindBuffer(GL_ARRAY_BUFFER,textureBuffer);
glVertexAttribPointer((GLint)2,2,GL_FLOAT,GL_FALSE,0,(GLvoid*)m_texcoords);

glBindBuffer(GL_ARRAY_BUFFER,vertexcBuffer);
glVertexAttribPointer((GLint)0,3,GL_INT,GL_FALSE,0,0);

glDrawArrays(GL_QUADS,0,12);

所以,看起来代码只从我的纹理(角)中读取 4 个像素,输出颜色将是 outColor = ctopleft+ctopright+cbotleft+cbotright 像这样。 如果你愿意,我会发送更多代码,但我认为问题出在这些线后面。 我尝试了不同的坐标,排序,一切。我还阅读了几乎所有关于此类问题的主题。我使用的是 ogl 游戏编程第 2 版,但没有 cd,所以我无法检查我是否编码良好,因为书中只有部分代码。

【问题讨论】:

  • 您是否尝试过渲染纹理坐标的样子?
  • 在设置“活动”纹理单元之前绑定纹理。如果您在软件中使用多个纹理单元,那么这可能是罪魁祸首。

标签: opengl colors textures glsl shader


【解决方案1】:

您的代码存在一些问题。

    1234563 /p>
  1. 您在设置“活动”纹理单元之前绑定了纹理。它默认为 GL_TEXTURE0,但这仍然是不好的做法。

【讨论】:

  • 我改变了它们,现在在片段着色器中,texCoord0 应该是“in”,现在一切正常。我还在绑定之前激活了纹理单元。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2015-03-20
  • 2013-10-05
  • 2010-09-24
  • 2013-12-09
  • 1970-01-01
相关资源
最近更新 更多