15

iPhone SDK には、一連の (Vertex & Fragment) GLSL シェーダーで ES 2.0 を使用して、さまざまな色のボックスをレンダリングする例があります。この API を使用して単純なテクスチャをレンダリングする方法の例はありますか? 私は基本的にクワッドを取り、その上にテクスチャを描きたいと思っています。

古い ES 1.1 API はもうまったく機能しないので、始めるには少し助けが必要です。ほとんどのシェーダー リファレンスは主に高度なシェーディング トピックについて述べていますが、バインドされたテクスチャを使用するようにシェーダーに指示する方法と、UV を参照する方法についてはよくわかりません。

4

4 に答える 4

15

Web サイトには、 OpenGL ES 2という書籍と一緒に使用できる、これに関する優れたチュートリアルがあります。この書籍の例は、すべてwww.opengles-book.comにあります。

第 9 章、Simple_Texture2D はまさにあなたが望むことを行います。テクスチャをサンプリングして初期化し、テクスチャを使用して三角形をシェーディングするシェーダーをセットアップします。

シェーダー プログラムは次のようになります。

varying vec2 v_texCoord;
uniform sampler2D s_texture;
void main() {
  gl_FragColor = texture2D(s_texture, v_texCoord);
}

次のように設定します。

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, userData->textureId);
// Set the sampler texture unit to 0
glUniform1i(userData->samplerLoc, 0);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);

ただし、上記のリンクから実際のコードを参照して、例を実際に確認してください。

于 2010-10-20T00:20:18.383 に答える
9

実際に機能する、私が作成できる最も単純なバージョンは次のとおりです。


セットアップ (頂点配列に対して glVertexAttribPointer を実行した直後)

GLint program; // your shader-program, pre-filled

...

// AFTER you've created *and set* the EAGLContext
GLKTextureInfo* appleTexture = [GLKTextureLoader
         textureWithContentsOfFile:... options:... error:...];
// NB: make sure that the returned texture is not nil!
// if it's nil, you'll get black objects, and need to check
// your path to your texture file

...

// INSIDE your VAO setup (usually "setupGL" in Apple's template),
// assuming you're using VAO,
// i.e. after "glBindVertexArrayOES"
GLint _textureBuffer; // an empty buffer that we'll create and fill
glEnableVertexAttribArray( glGetAttribLocation(program, "a_textureCoordinate") );
glGenBuffers(1, &_textureBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _textureBuffer);
glBufferData(GL_ARRAY_BUFFER, 
        self.currentScene.meshNumVertices * sizeof( (*self->sharedMeshTextureCoords) ),
        self->sharedMeshTextureCoords, GL_DYNAMIC_DRAW);
glVertexAttribPointer( glGetAttribLocation(program, "a_textureCoordinate"),
        2, GL_FLOAT, GL_FALSE, 0, 0);

glActiveTexture(GL_TEXTURE0);

レンダリング (glDrawArrays などを呼び出す前の最後の処理)

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, [appleTexture name]);
glUniform1i( glGetUniformLocation( program, "s_texture"), 0); // No idea

テクスチャ シェーダ:

attribute vec4 position;
attribute vec2 a_textureCoordinate;

varying vec2 v_textureCoordinate;

uniform mat4 modelViewProjectionMatrix;
uniform mat3 normalMatrix;

void main()
{
    v_textureCoordinate = a_textureCoordinate;
    gl_Position = modelViewProjectionMatrix * position;
}

フラグメント シェーダー:

uniform sampler2D s_texture;
varying mediump vec2 v_textureCoordinate;

void main(void)
{
    gl_FragColor = texture2D( s_texture, v_textureCoordinate );
}
于 2012-12-30T03:15:25.280 に答える
5

残念ながら、OpenGL ES 2.0 は GLSL の赤い頭のステップ子バージョン 1.4 を使用します。人々が投稿するチュートリアルのほとんどは、このバージョンでは機能しません。ftransform や gl_TexCoord[0] などのヘルパー変数はすべて削除されました。純粋な基本以上の特定の ES 2.0 チュートリアルを見つけるのは困難です。

OpenGL ES 2.0 は完全にプログラム可能なパイプラインであり、固定機能はすべて廃止されています。それを使用したい場合は、独自の行列を提供して、モデル ビューと射影行列であったものを追跡する必要があります。

数か月前に投稿したことは知っていますが、まだ情報を探している人がいる場合は、opengl.org で OpenGL 3.0 に関連するものを検索してください。ある程度適用できる優れたソース リリースが多数ありました。そこにあるフォーラムも非常に優れた情報源です。

于 2010-08-31T18:06:12.130 に答える
0

Lighthouse3Dのこのチュートリアルやclockworkcodersのこのチュートリアルのような「通常の」OpenGL チュートリアルを試しましたか? これは、OpenGL ES でも機能するはずです。

于 2010-05-08T16:31:10.750 に答える