2016-04-27 13 views
1

プロジェクトのJava(lwjgl)でOpenGLのものをいくつか実行しています。その中には、OBJ形式の3Dモデルのインポートが含まれています。すべてのように見えます。頂点を移動しようとするまで、モデルが分割されると、それらを右に見ることができます。 ブレンダーからのSuzanneです.UVは完全に黒色のテクスチャ(可視性のために)でマップされています。 FRAGシェーダでは、私は通常、世界のアップベクトル間の断片角に応じて、フラグメントにいくつかの白い色を追加している:頂点変位破砕メッシュ

enter image description here

をこれまでのところは良いです。しかし、同じ頂点に小さなY成分の変位を適用すると、面の伸びが増すことが予想されます。代わりに、この問題が発生した:

enter image description here

頂点シェーダ:

#version 150 

in vec3 position; 
in vec2 texCoords; 
in vec3 normal; 

void main() 
{ 
    vertPosModel = position;       

    cosTheta = dot(vec3(0.0, 1.0, 0.0), normal);  

    if(cosTheta > 0.0 && cosTheta < 1.0)  
     vertPosModel += vec3(0.0, 0.15, 0.0); 

    gl_Position = transform * vec4(vertPosModel, 1.0); 
} 

フラグメントシェーダ:

#version 150 

uniform sampler2D objTexture; 
in vec2 texcoordOut; 
in float cosTheta; 
out vec4 fragColor; 

void main() 
{ 
    fragColor = vec4(texture(objTexture, texcoordOut.st).rgb, 1.0) + vec4(cosTheta); 

} 
+1

私が質問を改善する方法を教えてください。臆病者にならないでください。 – peanutops

答えて

2

そうに、あなたのアルゴリズムは、頂点の由来プロパティに基づいて、頂点の位置をオフセット正常。メッシュが完全に滑らかであれば、接続されたメッシュだけが生成されます。すなわち、2つの三角形が合流する場合、共有頂点の法線は三角形の両側で同じでなければならない。

モデルが表面上で不連続な法線を持つ場合、法線が連続していないところでどこでもブレークが現れることがあります。つまり、通常の不連続部分が存在するエッジが切断される可能性があります。

私は、Blender3Dがスザンヌのスムーズなバージョンを生成できることは確信しています。だから...あなたは滑らかなメッシュを生成しましたか?それともそれはファセットですか?

+0

「スムースまたはフラット」シェーディングを選択できる左のツールバーをBlenderで使用している場合はYesです。私は両方を試しましたが、法線だけを変更した場合、現時点ではどの照明計算にも法線を使用していないため、問題をどのように修正できるかわかりません(これは私のToDoリストにあります)。 – peanutops

+0

@peanutops:私が言ったように、あなたはあなたのポジション*計算に法線を使っています。法線がうまく接続されていない場合、それらから計算された*位置も接続されません。 –

+0

共有頂点が面法線を共有頂点法線にマージするように、私は.objインポータを書き直す必要があると思います。私は昨日何か似たようなことをしました - blenderから.x3dを代わりにエクスポートしました(法線リストは面ごとではなく頂点ごとにエクスポートされます)。 – peanutops

関連する問題