1

レンダリングコードをラップトップに移動しましたが、openglとglslで問題が発生しています。

私はこのような頂点シェーダーを持っています(簡略化):

uniform float tile_size;

void main(void) {
gl_PointSize = tile_size;
// gl_PointSize = 12;
}

また、gl_Pointcoordを使用してテクスチャを読み取り、フラグメントの色を設定するフラグメントシェーダー。私のC++プログラムでは、次のようにtile_sizeをバインドしようとしています。

glEnable(GL_TEXTURE_2D); 
glEnable(GL_POINT_SPRITE);
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);

GLint unif_tilesize = glGetUniformLocation(*shader program*, "tile_size");
glUniform1f(unif_tilesize, 12);

(明確にするために、glUseProgramを使用してプログラムを既にセットアップしました。示されているのは、この特定のユニフォームに関するスニペットです)

このように設定すると、1ピクセルのポイントが得られ、openglがunif_tilesizeのバインドに失敗していることがわかりました(-1に設定されます)。

頂点シェーダーでコメントを入れ替えると、12pxのポイントスプライトが正常に表示されます。

奇妙なことに、他のコンピューターのまったく同じコードは完全に正常に機能します。私のラップトップのopenglバージョンは2.1.8304で、ATI radeon x1200を実行しています(デスクトップのnvidia 8800gtを参照)(これが関連する場合...)。

編集私は問題をよりよく反映するために質問のタイトルを変更しました。

4

2 に答える 2

1

glUseProgram制服を着る前に電話するのを忘れました。

于 2012-10-01T18:34:57.500 に答える
1

そのため、もう 1 日遊んだ後、ユニフォームを gl_PointSize にバインドできないという最初の問題は解決していませんが、既存のポイント スプライト レンダラーを ATI カードで動作するように変更しました。 (古い x1200) そして、私が学んだことのいくつかを共有したいと思いました.

gl_PointSize に関する何かが壊れていると思います (少なくとも私のカードでは)。頂点シェーダーでは、 を使用して 8 ピクセルのポイント スプライトを取得できましたgl_PointSize=8.0;が、 を使用gl_PointSize=tile_size;すると、均一な tile_size にバインドしようとしたものは何でも 1 ピクセルのスプライトが得られました。

幸いなことに、頂点ごとに異なるサイズのタイルは必要ないのでglPointSize(tile_size)、代わりに main.cpp を呼び出したところ、うまくいきました。

gl_PointCoordフラグメント シェーダーで作業を開始する (つまり、(0,0) 以外の値を返す) ために、main.cpp を呼び出す必要がありglTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE );ました。

頂点シェーダーとフラグメント シェーダーの間のどこかで変数がめちゃくちゃになるというばかげた問題が続いていました。「関連情報を取得するためにグーグルに何を入力すればよいかを推測する」という長いゲームの後、私はフォーラムを見つけました (そしてすぐに失われました) gl_TexCoord[0]。破損します。

これを修正するために、フラグメント シェーダーの最後に次の行を追加しました。

_coord = gl_TexCoord[0].xy;

ここで、_coord は未使用の vec2 です。(gl_Texcoord は他の場所では使用されないことに注意してください)。

この行がないと、すべての色が青くなり、テクスチャ ルックアップが壊れました。

于 2012-10-03T13:49:29.337 に答える