1

ピクセル マップ データは 1 チャネル、8 ビットです。ピクセルマップの幅と高さがあります。

ピックスマップ データをフラグメント シェーダーに送信しようとしています。VAO と VBO で ogl3 を使用しています。

私のセットアップ:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_RECTANGLE, texture);
glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, data);
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, ..., vertices, GL_STATIC_DRAW);
...create program...
glUseProgram(program);
glUniform1i(glGetUniformLocation(program, "image"), 0);
glDrawArrays(GL_TRIANGLE_FAN, 0, ...);

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

uniform sampler2DRect image;

varying vec2 varying_texcoord;

void main() {
    vec4 sample = texture2DRect(image, varying_texcoord);
    gl_FragColor = vec4(1.0, 0.0, 0.0, sample.a);
}

gl_FragColor は、sample.a の値に応じてピクセルを明るい赤と暗い赤でペイントする必要がありますが、sample.a は常に 1.0のようです - 純粋な赤 #ff0000 を取得しています。問題は glTexImage2D にあると思いますね。

プログラムとデータが有効であると仮定してください。

4

2 に答える 2

4

あなたが探している答えはglTexImage2Dのドキュメントにあると思います。それは言う

" GL_RED : 各要素は単一の赤のコンポーネントです。GL はそれを浮動小数点に変換し、緑と青の場合は 0、アルファの場合は 1 を付けて RGBA 要素にアセンブルします。次に、各コンポーネントに符号付きスケール係数 GL_c_SCALE を掛けて加算します。符号付きバイアス GL_c_BIAS に、範囲 [0,1] にクランプされます。」

.a コンポーネントを要求していますが、これは常に 1 です。テクスチャに実際にデータが含まれているコンポーネントを使用する必要があります。これは .r です。

お役に立てれば!

于 2012-06-22T14:53:25.907 に答える
1

質問は非常に古いですが、答えは他の人を助けることができます.

を使用する場合は、真のピクセル座標を使用する必要がありますsampler2DRect。頂点シェーダーの着信テクスチャ座標を にコピーすると仮定しますvarying_texcoord

その場合、座標を計算する必要があります。

vec2 coords = varying_texcoord * imageSize(image); 

次に座標を渡します。

vec4 sample= texture(image, coords);
于 2015-04-30T14:55:54.387 に答える