2016-06-21 10 views
-1

飛行機にガラス球がある屈折シェーダを作成しようとしています。私の問題は、テクスチャがプレーンに表示されないということです。テクスチャがプレーンに表示されない

飛行機コード:

varying vec3 varPosition; 
varying vec2 varTexCoords; 

uniform vec3 sphere_center; 
uniform float sphere_radius; 
uniform float sphere_refractive_index; 

uniform vec3 eyePosition;  

uniform sampler2D texture; 

out vec3 fragColor; 

void main() 
{ 
    vec3 ray_direction = normalize(varPosition - eyePosition); 

    float a = dot(ray_direction, ray_direction); 
    float b = 2.0 * dot(ray_direction, eyePosition - sphere_center); 
    float c = dot(sphere_center, sphere_center) + dot(eyePosition, eyePosition) - 2.0 * dot(sphere_center, eyePosition) - sphere_radius*sphere_radius; 

    float test = b*b - 4.0*a*c; 

    if (test >= 0.0) { 
     //there is an intersection with the sphere 
     //here I refract the ray 
    } else { 
     //no intersection with the sphere 
     //we test for shadow  
     if (test >= 0.0) { 
      //the point is in shadow 
      vec3 black = vec3(0.0); 
      fragColor = mix(texture2D(texture, varTexCoords).rgb,black,shadowIntensity).rgb; 
     } else { 
      //the point is not in shadow 
      fragColor = texture2D(texture, varTexCoords).rgb; 
     }   
    }  
} 

状況は球が塗装されることをですが、飛行機はグレーのまま:

GLfloat plane[4][5] =       // s, t, x, y, z 
{ 
    0.0f, 0.0f,  0.0f, 0.0f, 0.0f, 
    0.0f, 1.0f,  0.0f, 0.0f, 100.0f, 
    1.0f, 1.0f,  80.0f, 0.0f, 100.0f, 
    1.0f, 0.0f,  80.0f, 0.0f, 0.0f, 
};  
void DrawPlane() 
{ 
    glBegin(GL_QUADS);  
    glVertex3fv(plane[0]+2);  
    glVertex3fv(plane[1]+2);  
    glVertex3fv(plane[2]+2);  
    glVertex3fv(plane[3]+2);  
    glEnd(); 
} 

そして、私のフラグメントシェーダは、次のようになります。問題は多分私のtexCoordsで、もし私がtexture.x関数のvarTexCoordsパラメータを(position.xzのようなものに)変更すると、それは飛行機をペイントすることになります。しかし、私はそこに必要なことがすべてあると私には思われます。

属性配列:

glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, 0, 5 * sizeof(GLfloat), (GLvoid*)(plane[0]+2));  
glVertexAttribPointer(ATTRIB_TEX_COORDS, 2, GL_FLOAT, 0, 5 * sizeof(GLfloat), (GLvoid*)(plane[0])); 

私は属性の位置に結合して、私は、頂点属性配列を有効にします。

glBindAttribLocation(program->id(), ATTRIB_VERTEX, "position"); 
glBindAttribLocation(program->id(), ATTRIB_TEX_COORDS, "texCoords"); 

glEnableVertexAttribArray(ATTRIB_VERTEX); 
glEnableVertexAttribArray(ATTRIB_TEX_COORDS); 

私はすべてを試してみました。たぶんエラーは何か些細なもので、私はまっすぐ考えることができませんこの私の心を失うことに近いです。

何かヒントありがとうございます。

+0

glEnable(TEXTURE_2D); OpenGLは州に基づいています。 – Krythic

+0

私はinitGL()関数に持っています。 – Wanderer

+0

@Krythic: 'glEnable(TEXTURE_2D);'はシェーダとはまったく無関係です。固定関数パイプラインにのみ影響します。 – derhass

答えて

0

テクスチャ座標を使用しています。あなたには、いくつかの属性ポインタを設定するのですが、あなたが今までどんなTEX-COORDSを指定せずに、平面を描画するために即時モードglBegin()/glEnd()を使用しているので、これらは(そうシェーダがその属性の定数値が表示されます)、使用されることはありません。設定したアトリビュートポインタは、実際に頂点配列に基づく描画呼び出し(glDrawArrays()またはglDrawElements()など)を発行する場合にのみ使用されます。

+0

だから、 'glTertCoord2f(x.0f、y.0f)'をすべての 'glVertex3fv(plane [0] +2) 'の前に書くと、正しく動作するはずです(_x_と_y_は対応する1と0です)?残念ながら、そうではありません。 – Wanderer

+0

いいえ、そうしてはいけません。 'glVertex'、' glColor'、 'glTexCoord'などを使うと、固定機能のパイプラインの非推奨の組み込み属性を設定します。 _generic_属性のシェーダーを使用しているため、さまざまな属性インデックスとともに 'glVertexAttrib'を使用する必要があります。 OpenGLは 'glVertex'がジェネリックアトリビュート0を設定することと同等であることを保証するだけなので、あなたが少なくとも正しい頂点座標を得た理由は' ATTRIB_VERTEX'が '0'である可能性が最も高いです。ただし、即時モードを完全に削除することをお勧めします。 – derhass

関連する問題