3

glGetActiveUniformNameは、ドキュメントに従ってGLSLユニフォームの名前の長さを照会するために使用できる関数です。これは、uniformNameをNULL(0)に設定し、GLsizeiポインターをout変数としてlengthに指定することで実行できます。これを行うと、ユニフォームの名前の長さがlengthパラメーターに返されることが期待されますが、この変数は、上記のように関数を呼び出した後も変更されません。GL_INVALID_VALUEであるエラーが表示されます。これは、ドキュメントによると、次の3つのいずれかを意味する可能性があります。

GL_INVALID_VALUE is generated if uniformIndex is greater than or equal to the value of GL_ACTIVE_UNIFORMS.

GL_INVALID_VALUE is generated if bufSize is negative.

GL_INVALID_VALUE is generated if program is not the name of a program object for which glLinkProgram has been issued.

私の場合、uniformIndexは0であり、GL_ACTIVE_UNIFORMSは5を報告します。bufSizeは意図的に0に設定されているため、負にすることはできません。使用するプログラムでGL_LINK_STATUSを指定してglGetProgramを呼び出すと、GL_TRUE(1)が返されます。これにより、このエラーの3つの既知の原因がすべて除外されます。glGetActiveUniformNameを呼び出し、有効なbufSizeuniformNameを使用して呼び出す直前に、glGetErrorによると、以前にエラーは発生していません。どちらもエラーなしで成功し、期待どおりにuniformNameのバッファーに書き込みます。ユニフォームの名前を正しく書く。

ユニフォームの名前の長さを報告せず、代わりに誤りを犯したこととは別に、他の厄介な兆候があります。bufSizeがゼロより大きい正の値に設定され、uniformNameがNULL(0)のままの場合、関数はとにかくuniformNameに書き込み、重大メモリ破損を引き起こす可能性があります。この動作は、uniformNameがNULL(0)である必要があり、何も書き込まれないという仕様にも準拠していません。

上記のすべての情報をまとめると、コードにエラーはないと安全に結論付けることができると思いますが、代わりに自分のコードの外のどこかにエラーがあるため、ここに投稿します。上記のように使用した場合のこの機能の動作を確認できる人はいますか?

これはドライバーの問題である可能性が高いと思います。つまり、nVidiaドライバー/ハードウェアを実行しているユーザーだけが問題を確認できますが、ユーザーのグループを除外するには時期尚早です。

PS:上記は、nVidia GeForce 660 GTXがインストールされた最新のドライバー(上記のステートメントを検証するために特別に更新された)を実行しているマシンで発生しました。マシンは、64ビットのWindows 7ProfessionalSP1を実行しているDellXPS8500です。プログラムは、完全に更新されたVisual Studio2012Professionalを使用して構築されました。この投稿は、nVidia Developer ForumsとDevMasterにも投稿されました。より良い露出のために、そして問題をより早く解決することを期待して、ここに投稿されました。

更新1:問題のコードは、別のGPU(nVidia GeForce 9600M GT)を搭載した別のマシンでテストされ、最新のドライバーを使用して同じ結果が得られました。このマシンは64ビットのWindows7UltimateSP1を実行しています。この場合も、バイナリはVS2012でビルドされました。

4

1 に答える 1

2

ここのドキュメントは間違っているようです。OpenGLの仕様は、ここでは非常に明確です。lengthこれは、実際にバッファに書き込まれる文字数に関するものです。uniformNameまた、仕様ではパラメータのNULLチェックは必要ありません。

または、言い換えると、ユニフォームの名前の長さglGetActiveUniformNameを取得するために使用することはできません。これは。で行う必要があります。glGetActiveUniform

wikiのドキュメントを修正しました。

于 2013-02-19T23:34:14.270 に答える