1

OpenGL ES 2.0 のチュートリアルを理解しようとしています。

この本では、「別の画像を読み込んでみて、追加のテクスチャ ユニットを使用して、この画像を現在の画像とブレンドしてみてください。フラグメント シェーダーで gl_FragColor に値を割り当てるときに、値を加算または乗算してみることができます」という演習が必要です。 ."

しかし、私は迷っています...

これはコードです:

@Override
public void onDrawFrame(GL10 gl) {
    // Clear the rendering surface.
    glClear(GL_COLOR_BUFFER_BIT);
    // Draw the table.
    textureProgram.useProgram();
    textureProgram.setUniforms(projectionMatrix, texture);
    table.bindData(textureProgram);
    table.draw();
}

どこ

テクスチャプログラムは次のとおりです。

public class TextureShaderProgram extends ShaderProgram {

// Uniform locations
private final int uMatrixLocation;
private final int uTextureUnitLocation;
private final int uTextureUnitLocation2;
// Attribute locations
private final int aPositionLocation;
private final int aTextureCoordinatesLocation;

public TextureShaderProgram(Context context) {
    super(context, R.raw.texture_vertex_shader,
    R.raw.texture_fragment_shader);
    // Retrieve uniform locations for the shader program.
    uMatrixLocation = glGetUniformLocation(program, U_MATRIX);
    uTextureUnitLocation2 = glGetUniformLocation(program, "u_TextureUnit2");

    uTextureUnitLocation = glGetUniformLocation(program, U_TEXTURE_UNIT);
    // Retrieve attribute locations for the shader program.
    aPositionLocation = glGetAttribLocation(program, A_POSITION);
    aTextureCoordinatesLocation =
    glGetAttribLocation(program, A_TEXTURE_COORDINATES);
    }

public void setUniforms(float[] matrix, int textureId) {
    // Pass the matrix into the shader program.
    glUniformMatrix4fv(uMatrixLocation, 1, false, matrix, 0);
    glActiveTexture(GL_TEXTURE0);
    // Bind the texture to this unit.
    glBindTexture(GL_TEXTURE_2D, textureId);
    // Tell the texture uniform sampler to use this texture in the shader by
    // telling it to read from texture unit 0.
    glUniform1i(uTextureUnitLocation, 0);
    }

public int getPositionAttributeLocation() {
    return aPositionLocation;
    }
    public int getTextureCoordinatesAttributeLocation() {
    return aTextureCoordinatesLocation;
    }
}

これがフラグメントシェーダーです

precision mediump float;
uniform sampler2D u_TextureUnit;

varying vec2 v_TextureCoordinates;
void main()
{
gl_FragColor = texture2D(u_TextureUnit, v_TextureCoordinates);
}

これは頂点シェーダーです。

uniform mat4 u_Matrix;
attribute vec4 a_Position;
attribute vec2 a_TextureCoordinates;
varying vec2 v_TextureCoordinates;
void main()
{
v_TextureCoordinates = a_TextureCoordinates;
gl_Position = u_Matrix * a_Position;
}
4

1 に答える 1

3

OpenGL ES には、2 つ以上のテクスチャをサンプリングして最終的な gl_FragColor を生成する機能があります。あなたの Java コードはこれを正しく設定しているようですが、フラグメント シェーダーはテクスチャの 1 つしか使用していません。2 つを足し合わせると、次のようになります。

uniform sampler2D u_TextureUnit_0;
uniform sampler2D u_TextureUnit_1;
varying vec2 v_TextureCoordinates;

void main()
{
    vec4 vColor_0 = texture2D(u_TextureUnit_0, v_TextureCoordinates);
    vec4 vColor_1 = texture2D(u_TextureUnit_1, v_TextureCoordinates);
    gl_FragColor = vColor_0 + vColor_1;  
}

これにより、2 つの vec4 カラー サンプルが追加されます: (R0 + R1、G0 + G1、B0 + B1、A0 + A1)

于 2013-07-26T22:57:27.137 に答える