2

私は多くの OpenGL と GLSL のチュートリアルを読んできましたが、シェーダーの操作方法をまだ理解できません。gl_ModelViewProjectionMatrix は非推奨であり、「自分で」マトリックスを計算する必要があることを知りました-どうすればよいですか? ウィキペディアは、その計算を達成するために均一変数を使用します (そのポイントが何なのかわかりません)。

glEnableVertexAttribArray や glVertexAttribPointer など、シェーダーで使用する必要がある他の関数に出くわしましたが、それらがシェーダーにどのように接続されているかわかりませんでした。

4

3 に答える 3

2

私は現在、openGL を自分で学んでいますが、幸運にもより良いリソースを見つけることができたようです。このチュートリアルはペ​​ースが速いですが、多くの基本事項をカバーしています。OpenGL Superbible 5th edについても言及します。、しかし、個人的にはあまり役に立ちませんでした。行列に関する問題に関しては、OpenGL を学習する前に、線形代数と基本的な 3D 数学の基本を理解するのがおそらく最善です。そのためには、この本、または上記の Durian Software チュートリアルをお勧めします。

シェーダーに関する限り、私はおそらく最良のソースではありませんが、単純なシェーダーの構築は通常次のようになります。

  1. シェーダーを文字配列としてメモリにロードします。
  2. glCreateShader() を使用して、頂点シェーダー、フラグメント シェーダー、およびプログラム オブジェクトのハンドルを生成します。
  3. glShaderSource() と glCompileShader() を使用して、ソース コードをシェーダー オブジェクトにバインドします。
  4. 頂点シェーダーとフラグメント シェーダーを glLinkProgram() でリンクしてから、glUseProgram() で最終的なプログラムを有効にします。
  5. 頂点属性 (座標、テクスチャ座標、法線など) を glGenBuffer() (ハンドルを作成するため)、glBindBuffer()、および glBufferData() を使用してバッファにロードします。
  6. 頂点属性配列バッファー (ここでも、処理する座標、法線、およびその他のデータのコレクションのみ) をバインドし、glVertexAttribPointer() を使用して、シェーダーが正しく読み取れるようにします。
  7. ユニフォームと属性は、CPU 上のプログラムが GPU 上のシェーダーと通信できるようにするための手段にすぎません。
  8. 描く

申し訳ありませんが、私はこれ以上説明する資格がありません。また、プロセス全体の基本的なコード例はあまりにも多くのことを占めてしまいますが、必要に応じて少しだけ提供することもできます。ただし、リンクしたリソースにはそれぞれ完全な例が含まれています。

于 2012-08-25T04:20:35.263 に答える
0

これらのチュートリアルは非常に簡単です http://www.lighthouse3d.com/tutorials/glsl-tutorial/ 従うだけで、マトリックスでファンキーなことは何もしません.

頂点属性を使用するには、GLSL シェーダーで定義する必要があります。

attribute float attribute_name; //or another type

void main()
{

/// do it

}

cpp/c で配列を渡します。

glUseProgram(program);
//get location of your attribute variable
GLuint loc = glGetAttribLocation(program, "attribute_name"); 
//enable it
glEnableVertexAttribArray( loc );
//and pass the value
glVertexAttribPointer(loc,1,GL_FLOAT,GL_TRUE,0,attr_array);

//pass other stuff as usual
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glTexCoordPointer(2, GL_FLOAT, 0, uvs );

glEnableClientState( GL_VERTEX_ARRAY );

glVertexPointer ( 3, GL_FLOAT, 0, ver );

glEnableClientState( GL_NORMAL_ARRAY );

glNormalPointer (    GL_FLOAT, 0, nor );

//do draw
于 2012-08-24T23:15:57.470 に答える
0

私は最初にほぼ同じものを見つけました。オンラインで読んだものの多くは、私が望んでいたほど詳細に説明されていませんでした。OpenGL と GLSL のさまざまなバージョンと組み合わせて、いくつかの素晴らしい瞬間がありました。

しかし、最近購入したのはOpenGL ES 2.0 プログラミング ガイド (ISBN-10: 0321502795、ISBN-13: 978-0321502797)でした。ES 2.0 に焦点を当てていますが、これは GLSL の良い出発点だと思います。最初に読んでから戻って実験することを好むので、実際にはまだどの演習も試していません. しかし、これまでに約 100 ページを読みましたが、すべてが見事に説明されており、初心者にとって賢明な順序になっています。

この本を『Essential Mathematics for Games and Interactive Applications: A Programmer's Guide』(ISBN-10: 0123742978、ISBN-13: 978-0123742971)と組み合わせると、十分に理解できるはずです。

于 2012-08-25T06:53:52.110 に答える