web-dev-qa-db-ja.com

テクスチャを使用したOpenGLES2.0レンダリング

IPhone SDKには、ES 2.0と(頂点とフラグメント)GLSLシェーダーのセットを使用して、さまざまな色のボックスをレンダリングする例があります。このAPIを使用して単純なテクスチャをレンダリングする方法の例はありますか?基本的にクワッドを取り、それにテクスチャを描きたいです。

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

ありがとう!

14
Kyle

この本と一緒に行くための素晴らしいチュートリアルが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);

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

15

これが私が実際に機能させることができる最も単純なバージョンです:


セットアップ(頂点配列に対して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 );
}
7
Adam

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

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

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

5
oceand

Neheチュートリアルの束をOpenGLES2.0に移植しました-利用可能 ここ 。チュートリアル6にテクスチャレンダリングの例があります。

2
Chris

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

0
Danvil