2

これらのシェーダーは私のゲーム エンジンではうまく機能しますが、webGL で使用しようとすると、大量のエラーが発生しました。

ERROR: 0:21: 'for' : Invalid init declaration
ERROR: 0:2: '' : Version number not supported by ESSL 
ERROR: 0:7: 'ftransform' : no matching overloaded function found 
ERROR: 0:7: 'assign' :  cannot convert from 'const mediump float' to 'Position highp 4-component vector of float'
ERROR: 0:9: 'gl_MultiTexCoord0' : undeclared identifier 
ERROR: 0:9: 'assign' :  cannot convert from 'float' to 'varying highp 4-component vector of float'

それで、誰でも助けることができますか?

<script id="shader-fs" type="x-shader/x-fragment">
    precision mediump float;

    const float BLOOM_AMOUNT = 10.0;
// Increasing range can lower your FPS.
const int BLOOM_RANGE = 3;


uniform sampler2D composite;
varying vec4 texcoord;
varying vec4 texel;


        vec4 addBloom(vec4 c, vec2 t) {
                int j;
                int i;
                vec4 bloom = vec4(0.0);
                vec2 loc = vec2(0.0);
                float count = 0.0;

                for( i= -BLOOM_RANGE ; i < BLOOM_RANGE; i++ ) {
                        for ( j = -BLOOM_RANGE; j < BLOOM_RANGE; j++ ) {
                                loc = t + vec2(j, i)*0.004;

                                // Only add to bloom texture if loc is on-screen.
                                if(loc.x > 0.0 && loc.x < 1.0 && loc.y > 0.0 && loc.y < 1.0) {
                                        bloom += texture2D(composite, loc) * BLOOM_AMOUNT;
                                        count += 1.0;
                                }
                        }
                }
                bloom /= vec4(count);

                if (c.r < 0.3)
                {
                        return bloom*bloom*0.012;
                }
                else
                {
                        if (c.r < 0.5)
                        {
                                return bloom*bloom*0.009;
                        }
                        else
                        {
                                return bloom*bloom*0.0075;
                        }
                }
        }


void main() {


        vec4 color = texture2D(composite, texcoord.st);

        color += addBloom(color, texcoord.st);

        gl_FragColor = color;
}
</script>

<script id="shader-vs" type="x-shader/x-vertex">
    #version 120

    varying vec4 texcoord;

    void main() {
        gl_Position = ftransform();

        texcoord = gl_MultiTexCoord0;
    }
</script>
4

2 に答える 2

8

WebGLはOpenGLESに基づいていますが、これはOpenGLと同じではありません(ほとんどサブセットです)。OpenGL ESのバージョンのGLSLにはない、または異なる機能がいくつかあります。

エラーメッセージから特定できる問題は次のとおりです。

  • forループでは、変数は外部ではなく、ループヘッダー自体で宣言する必要があります。

    for( int i = -BLOOM_RANGE ; i < BLOOM_RANGE; i++ ) {
    
  • 固定機能モードは、OpenGLESには完全に存在しません。独自の変換とライティングをすべて作成する必要があります(または、もちろん、それを提供するフレームワークを使用します)。ftransform()これがとがない理由ですgl_MultiTexCoord0。(変換エラーはこれから連鎖していると思います。)

  • GLSL ESは異なるバージョン番号を使用するため、バージョン宣言に反対します。

于 2012-06-27T00:14:32.850 に答える
0

WebGL は、組み込みのもの ( 、など) を使用しないOpenGL ES 2 に基づいています。それ以外の場合、コードは構文的に問題ありません。OpenGL ES 1 の目的では問題なくコンパイルされます (ただし、WebGL では問題ありません)。ftransformgl_MultiTexCoord0

于 2012-06-27T16:46:13.997 に答える