-1

私は Premake 4 プラットフォームで OpenGL バージョン 3.3 を使用する素晴らしい本で OpenGL を学んでいますが、実際には OpenGL バージョン 2.0 をサポートする Android 用の OpenGL を学びたいと思っています。コンセプトは同じなのでほぼ同じなのですが、シェーダー言語のコードで困っています。

たとえば、本では、autor は次のコードで Vertex Shader を実装しています。

#version 330

layout(location = 0) in vec4 position;

void main(){
  gl_Position = position;
}

多くの調査の後、コードを使用して Android でこの Vertex Shader コードを正確に実装することができました。

String vertexShaderCode =
        "attribute vec4 vPosition;" +
        "void main() {" +
        "  gl_Position = vPosition;" +
        "}";

しかし、この頂点シェーダーを以下に実装する方法がわかりません。

#version 330

layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;

smooth out vec4 theColor;

void main() {
  gl_Position = position;
  theColor = color;
}

この本はhttp://arcsynthesis.org/gltut/Basics/Tut02%20Vertex%20Attributes.htmlです。

4

1 に答える 1

3

OpenGL ES 2.0 で記述されているため、シェーダーを実装することはできません。このシェーダーは、OpenGL 3.3 GLSL 仕様に基づいて作成されています。OpenGL ES 2.0 は、GLSL 120 (OpenGL 2.1) とほぼ同等の構文を使用します。

  • 修飾子は、シェーダー ステージ間の補間を制御するために使用されますsmooth。GLSL ES はこれをサポートしていません。すべての頂点シェーダー出力は、GLSL ES でスムーズに補間されます。

  • layout (...)GLSL ES ではサポートされていないためglBindAttribLocation (...)、場所の設定には を使用する必要があります。

  • inGLSL ES ではサポートされてoutいないためattribute、頂点シェーダーの入力、varying頂点シェーダーの出力、およびフラグメント シェーダーの入力に使用する必要があります。

最後に、#version 330無効です。OpenGL ES 2.0 には、バージョン 1.0 の GLSL ES 仕様が 1 つしかありません (したがって、準拠している OpenGL ES 2.0 シェーダーは で始まる必要があります#version 100)。

その特定の頂点シェーダーの実装に関する質問に答えるには:

#version 100

attribute vec4 position;
attribute vec4 color;

varying   vec4 theColor;

void main() {
  gl_Position = position;
  theColor    = color;
}

もちろん、これは方程式の半分にすぎません。OpenGL ES 2.0 準拠の構文も使用するフラグメント シェーダーとペアにする必要があります。

この頂点シェーダーで動作する最小限のフラグメント シェーダー:

#version 100

varying vec4 theColor; // In GLSL 330 this would be written as: in vec4 theColor;

void main (void) {
  gl_FragColor = theColor;
}
于 2013-11-06T01:05:07.323 に答える