11

OpenGL ES 2.0 で OpenGL ES 1.1 と同様の結果を得る方法がわかりません。実際に Sampler2D を使用して (テクスチャとアルファ チャネルをフレーム バッファにブレンドするため)、色も設定したいと考えています。テクスチャは色でペイントする必要があります-OpenGL ES 1.1のように、私のFragmentShaderは次のようになります:

varying lowp vec4 colorVarying;
varying mediump vec2 texcoordVarying;
uniform sampler2D texture;

void main(){
    gl_FragColor = texture2D(texture, texcoordVarying) + colorVarying;
}

しかし、「+ colorVarying」の部分は私のアルファチャンネルを黒で破壊し (AlphaValue が 0 の場合、colorVarying も追加するため)、奇妙なグラデーション効果を生み出します...固定関数パイプラインでテクスチャとカラーチャンネルをどのように組み合わせますか? glColor4f の私の代替品は次のとおりです。

void gl2Color4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a){
    const GLfloat pointer[] = {r, g, b, a};
    glVertexAttribPointer(ATTRIB_COLOR, 2, GL_FLOAT, 0, 0, pointer);
    glEnableVertexAttribArray(ATTRIB_COLOR);
}

そして、私は glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); を使用しています。これが何らかの形で関連している場合...

色 1.0、0.0、1.0、1.0 については、次のようになります。 今

そして、私は取得したい:

見たいもの

これを達成するためのアイデアはありますか?どんな助けでも大歓迎です。

4

2 に答える 2

20

OpenGL ES 1.1 のデフォルトの方法で頂点カラーをテクスチャと組み合わせるには、フラグメント シェーダーを次のようにする必要があります。

varying lowp vec4 colorVarying;
varying mediump vec2 texcoordVarying;
uniform sampler2D texture;

void main(){
    gl_FragColor = texture2D(texture, texcoordVarying) * colorVarying;
}

GL_MODULATEテクスチャに追加するのではなく、色で乗算することに注意してください。

OpenGL ES (1.1 と 2.0 の両方) の頂点配列指定関数に 0 のストライドを渡してもストライドが 0 にならないため、画像にグラデーションが表示されます。指定した形式/タイプの密集した要素。その結果、実際には配列の末尾を越えてランダム メモリに読み込んでいます。すべての頂点で同じ値が必要な場合は、現在の属性値を設定し、関連する配列を無効にする必要があります。

void gl2Color4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a){
    const GLfloat pointer[] = {r, g, b, a};
    glVertexAttrib4fv(ATTRIB_COLOR, pointer);
    glDisableVertexAttribArray(ATTRIB_COLOR);
}
于 2011-02-15T06:19:05.850 に答える