6

私はこのように三角形で作られた9つのクワッドを持っています:

ここに画像の説明を入力してください

私はVBOそれらに関するデータ(それらの位置とテクスチャの座標)を保存するために使用しています。

VBO私の質問は、クワッド5を、1つだけを使用して、残りのクワッドとは異なるテクスチャにすることは可能shaderですか?:

ここに画像の説明を入力してください

緑の色はテクスチャ1を表し、黄色はテクスチャ2を表します。

これまでのところ私は:

GLfloat vertices[] = { 
    // Positions
    0.0f, 0.0f,
    ...

    // Texture coordinates
    0.0f, 0.0f, 
    ...
};

VBOその配列を使用して作成しvertices[]、最初のテクスチャをバインドしてm_texture1(2番目のテクスチャにもアクセスできます- m_texture2)、シェーダーを呼び出します。

glBindTexture(GL_TEXTURE_2D, m_texture1);

glUseProgram(program);

glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vboId);          // for vertex coordinates
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);                                      // Vertices
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)(sizeof(GLfloat)*108));           // Texture
glDrawArrays(GL_TRIANGLES, 0, 108);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);

glUseProgram(0);

私の頂点シェーダー:

#version 330

layout (location = 0) in vec4 position;
layout (location = 1) in vec2 texcoord;

out vec2 Texcoord;

void main()
{
    gl_Position = position;
    Texcoord = texcoord;
}

そしてフラグメントシェーダー:

#version 330

in vec2 Texcoord;

out vec4 outputColor;

uniform sampler2D tex;

void main()
{
    outputColor = texture(tex, Texcoord) * vec4(1.0,1.0,1.0,1.0);
}

つまり、基本的にここでは1つのテクスチャのみを使用しています。これは、2番目のテクスチャをどのように使用できるかわからないためです。

4

1 に答える 1

3

これは、さまざまなテクスチャ画像ユニットを使用し、それらの値をに設定して行うことができますuniform sampler2D tex

glActiveTextureを呼び出してテクスチャ画像ユニット(GL_TEXTURE0)を設定し、緑のテクスチャをバインドしてから、アクティブなテクスチャをGL_TEXTURE1に設定し、黄色のテクスチャをバインドする必要があります。このようにして、緑のテクスチャはテクスチャ画像ユニットID0と黄色1になります。

描画呼び出しを2つに分割する必要があります。1つは緑のクワッド用で、もう1つは黄色用です。呼び出しごとにglUniform1iuniform sampler2D texを使用して設定することにより、使用するテクスチャを設定する必要があります。そして最後に、現在の呼び出しで描画している緑色または黄色の三角形を示す、VBO内の三角形のサブセットを呼び出します。glDrawArrays

また、例で描画する必要があるのが画像だけの場合は、テクスチャアトラスの使用を検討することもできます。その場合、1回の呼び出しで1つのテクスチャがマッピングされます。

于 2013-03-02T11:39:55.337 に答える