8

テクスチャを GLSL のスロットにバインドする方法について少し混乱しています。ここに私のシェーダーがあります:

#version 330

layout(location=0) in vec4 in_Position;
layout(location=1) in vec4 texCoords;
out vec4 ex_texCoords;

uniform mat4 ModelMatrix;
uniform mat4 ViewMatrix;
uniform mat4 ProjectionMatrix;

void main(void)
{
    gl_Position = (ProjectionMatrix * ViewMatrix * ModelMatrix) * in_Position;
    ex_texCoords = texCoords;
}


#version 330

in vec4 ex_texCoords;
out vec4 out_Color;

uniform sampler2D textureSampler;

void main(void)
{
    out_Color = texture(textureSampler2, ex_texCoords.xy);
}

マトリックスを設定するときは、均一な場所を照会してから、次のようにして、その場所に手動で値を設定する必要があります。

modelMatrixUniformLocation = glGetUniformLocation(ShaderIds[0], "ModelMatrix");
...
glUniformMatrix4fv(modelMatrixUniformLocation, 1, GL_FALSE, modelMatrix.data);

ただし、私が知る限り、テクスチャ サンプラーを初期化するためにそれを行う必要はありません。セットアップ時に、私がする必要があると思われるのはこれだけです:

glGenTextures(1, &TextureID);
glBindTexture(GL_TEXTURE_2D, TextureID);
glTexImage2D(...);

それで、私の質問は、マトリックスに対して行う必要があるのと同じプロセスをテクスチャに対して行う必要がないのはなぜですか? OpenGL ランタイムは、バインドしたテクスチャが定義したサンプラーであることをどのように「認識」しますか? 複数のテクスチャが必要な場合、どうすればよいでしょうか?

4

1 に答える 1

12

OpenGL はどのサンプラーを使用するかを認識していないため、glActiveTexture(GL_TEXTUREi)(where ifrom 0to GL_MAX_TEXTURES) を使用して手動でバインドする必要があります。デフォルトのサンプラーが であるため、コードが機能しますGL_TEXTURE0。明らかに、あなたは十分に幸運で、シェーダー リンカtextureSamplerが 0 に設定されています。

また、バージョン 3 以降の OpenGL API には、glGenSamplerglBindSamplerという新しい機能があります。テクスチャに依存しないサンプラー構成を使用できます! 詳細については、 http://www.g-truc.net/post-0267.htmlを参照してください。

また、 http: //www.g-truc.net/project-0026.html からサンプルをダウンロードすることをお勧めします。

于 2012-10-23T14:10:59.503 に答える