8

GLSLバージョン110では、gl_TexCoord []で座標を取得できますが、150では非推奨になりました。

OpenGLコード:

shader.setupShaderFromFile(GL_VERTEX_SHADER, "t.vert");
shader.setupShaderFromFile(GL_FRAGMENT_SHADER, "t.frag");
shader.linkProgram();

glGetFloatv(GL_MODELVIEW_MATRIX, modelview_mat_);
glGetFloatv(GL_PROJECTION_MATRIX, projectionview_mat_);

shader.begin();

glUniformMatrix4fv( glGetUniformLocation(shader.getProgram(), "MVMatrix"), 1, GL_FALSE, modelview_mat_);
glUniformMatrix4fv( glGetUniformLocation(shader.getProgram(), "MPMatrix"), 1, GL_FALSE, projectionview_mat_);

glBegin(GL_QUADS);
    glTexCoord2f(0, 0);glVertex2f(0, 0);
    glTexCoord2f(1, 0);glVertex2f(100, 0);
    glTexCoord2f(1, 1);glVertex2f(100, 100);
    glTexCoord2f(0, 1);glVertex2f(0, 100);
glEnd();

shader.end();

シェーダーコード:

バーテックス-

#version 150
in vec3 in_vertex;
in vec2 in_coord;
uniform mat4 MVMatrix;
uniform mat4 MPMatrix;

out vec2 tex_coord;

void main()
{
    vec4 v = vec4( in_vertex, 1.0 );

    tex_coord = in_coord;
    gl_Position = MPMatrix * MVMatrix * v;
}

断片:

#version 150

in vec2 tex_coord;

out vec4 frgcolor;

void main()
{
    frgcolor = vec4( tex_coord, 0.0, 1.0);
}

最終画面は赤いクワッドです。

テクスチャ座標をシェーダーに渡す方法は?または私のコードが間違っていますか?

4

2 に答える 2

6

非推奨のメソッドを使用したくない場合は、glTexCoord2fの使用を停止し、カスタム属性を使用する必要があります。

イミディエイトモードを維持したい場合は、glVertexAttrib2fを使用します。

シェーダーリンク後にインデックスをクエリすることにより、これを新しい変数'in_coord'とペアにします。

int program = glCreateProgram();
//create shader as normal
int texcoord_index = glGetAttribLocation(program, "in_coord");

glBegin(GL_QUADS);
glVertexAttrib2f(texcoord_index, 0, 0); ...

代わりにVA/VBOを使用する場合、代わりに使用する関数はglEnableVertexAttribArray / glVertexAttribPointer

于 2012-05-17T07:00:32.050 に答える
2

あなたの場合gl_TexCoord[0]は、頂点シェーダーを調べてください。シェーダーモデル1.5で確実に動作します

C ++の場合:

glActiveTexture(GL_TEXTURE0 );
glBindTexture(GL_TEXTURE_2D, id);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

glMatrixMode(GL_TEXTURE);
glLoadIdentity();

glBegin(GL_QUADS);
    glTexCoord2f(0, 0);glVertex2f(0, 0);
    glTexCoord2f(1, 0);glVertex2f(100, 0);
    glTexCoord2f(1, 1);glVertex2f(100, 100);
    glTexCoord2f(0, 1);glVertex2f(0, 100);
glEnd();

頂点シェーダーの場合:

gl_TexCoord[0]=gl_MultiTexCoord0; 

フラグメントシェーダー:

vec4 c = texture2D(texSampler, gl_TexCoord[0].st );
于 2012-05-17T08:07:10.493 に答える