2

最近 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を持っていないので、コードの一部しか本に載っていないので、うまくコーディングしているかどうかを確認できません。

4

1 に答える 1

1

コードにはいくつかの問題があります。

  1. フラグメント シェーダーでは、texCoord0 を として宣言しました。これは、フラグメント シェーダーと頂点シェーダーにoutある必要があります。これは、一方から他方に渡されるためです。inout

  2. 「アクティブな」テクスチャ ユニットを設定する前に、テクスチャをバインドしています。デフォルトは GL_TEXTURE0 ですが、これは依然として悪い習慣です。

于 2013-08-24T17:48:27.500 に答える