2011-01-26 14 views
2

屈折についての質問があります。OpenGL屈折、テクスチャが楕円体オブジェクト上で繰り返されています

屈折のためにテクスチャ画像(refertest_car.png)を使用しています。

しかし、何とか質感は私は、次のシェーダを使用しています乗じとgivinga歪んだ画像(Screenshot.pngを参照してください)

なっています。

attribute highp vec4 vertex; 
attribute mediump vec3 normal; 

uniformhighp mat4 matrix; 
uniformhighp vec3 diffuse_color; 
uniformhighp mat3 matrixIT; 

uniformmediump mat4 matrixMV; 
uniformmediump vec3 EyePosModel; 
uniformmediump vec3 LightDirModel; 
varyingmediump vec4 color; 

constmediump float cShininess = 3.0; 
constmediump float cRIR = 1.015; 

varyingmediump vec2 RefractCoord; 

vec3 SpecularColor= vec3(1.0,1.0,1.0); 

voidmain(void) 
{ 
    vec3 toLight = normalize(vec3(1.0,1.0,1.0)); 

    mediump vec3 eyeDirModel = normalize(vertex.xyz -EyePosModel); 
    mediump vec3 refractDir =refract(eyeDirModel,normal, cRIR); 

    refractDir = (matrix * vec4(refractDir, 0.0)).xyw; 

    RefractCoord = 0.5 * (refractDir.xy/refractDir.z) + 0.5; 

    vec3 normal_cal = normalize(matrixIT *normal); 
    float NDotL = max(dot(normal_cal, toLight), 0.0); 

    vec4 ecPosition = normalize(matrixMV * vertex); 
    vec3 eyeDir = vec3(1.0,1.0,1.0); 
    float NDotH = 0.0; 
    vec3 SpecularLight = vec3(0.0,0.0,0.0); 

    if(NDotL > 0.0) 
    { 
     vec3 halfVector = normalize(eyeDirModel + LightDirModel); 
     float NDotH = max(dot(normal_cal, halfVector), 0.0); 
     float specular =pow(NDotH,3.0); 

     SpecularLight = specular * SpecularColor; 
    } 

    color = vec4((NDotL * diffuse_color.xyz) + (SpecularLight.xyz) ,1.0); 

    gl_Position = matrix * vertex; 
} 

そして

varyingmediump vec2 RefractCoord; 
uniformsampler2D sTexture; 
varyingmediump vec4 color; 

voidmain(void) 
{ 
     lowp vec3 refractColor = texture2D(sTexture,RefractCoord).rgb; 
     gl_FragColor = vec4(color.xyz + refractColor,1.0); 
} 

誰も私がこの問題の解決策を知っていることはできますか?

ありがとうございました。

申し訳ありませんが、画像を添付できません。

+0

refractColorの計算は完全にうまくいっていて、本当に問題を引き起こしているのはRefractCoordだけなのでしょうか?イメージをどこかにアップロードできるのであれば、私はあなたのためにそれを添付することができます - 私は彼らが評判が一定量以下の人々のためにイメージを無効にすると思います。 – Tommy

答えて

0

屈折ベクトルが正しく計算されていないようです。 Hovewer、あなたの質問への答えはすでにタイトルです。楕円を見ると、ビューからの光線が円錐に亘って楕円を包みます。しかし、屈折後、コーンは画像の端を越えて広がり、0 - 1より大きいテクスチャ座標を与え、テクスチャがラップされることにつながります。だから私たちもそれを世話する必要があります。次のように

まず、屈折座標は、頂点シェーダで計算されるべきである。

vec3 eyeDirModel = normalize(-vertex * matrix); 
vec3 refractDir = refract(eyeDirModel, normal, cRIR); 

RefractCoord = normalize((matrix * vec4(refractDir, 0.0)).xyz); // no dehomog! 

RefractCoord現在、屈折目空間ベクトルを含みます。これは、(あなたのコードからは明らかではないが、それは疑わしい) "行列"がモデルビュー行列であることを意味する。シェーダをより速く実行したい場合は、正規化をスキップすることができますが、目立つエラーは発生しません。フラグメントシェーダーの修正を少ししました。

vec3 refractColor = texture2D(sTexture, normalize(RefractCoord).xy * .5 + .5).rgb; 

ここでは、normalize()を使用すると、テクスチャ座標によってテクスチャが繰り返されないことが確認されます。

2次元テクスチャを屈折に使用することは、ハーフライフ2のようにオンザフライで生成することによってのみ正当化する必要があることに注意してください。そうでなければ、キューブマップテクスチャを使用する必要があります。 3D方向に基づく色 - あなたが必要とするものです。

私はこれを助けてくれるはずです。(そして、ああ、私はこれをメモリから書きました。エラーがある場合は、コメントしてください)。

関連する問題