問題は解決しました。修正については以下を参照してください
長方形のパッチ、テッセレーション、およびカスタムの詳細レベルを使用して、TDM の「シースケープ」( https://www.shadertoy.com/view/Ms2SD1を参照) を実装しようとしています。残念ながら、私はgl_TessLevelOuter
権利を得ることができません。パッチの間にいくつかの小さな穴があります。
エラーを強調するためにスカイボックスを赤くしました。
私はglDrawArraysInstanced
64² 10*10 パッチを描画し、頂点シェーダーのカメラ位置の周りにそれらを再配置するために使用します。
#version 330 core
in vec3 in_Position;
out vec3 ex_Position;
layout (std140) uniform globalUniforms{
layout(row_major) mat4 mvp;
layout(row_major) mat4 vp;
vec3 cameraPos;
float time;
vec3 sun;
};
const float patchSize=10;
const int patchCount=64;
void main(){
ex_Position=in_Position;
ex_Position.xz+=patchSize*vec2(gl_InstanceID%patchCount-patchCount/2,int(gl_InstanceID/patchCount)-patchCount/2);
ex_Position.xz+=patchSize*floor(cameraPos.xz/patchSize);
}
次に、テッセレーション コントロール シェーダーで詳細レベルを計算します。
#version 410 core
layout(vertices = 4) out;
in vec3 ex_Position[];
out vec3 tc_Position[];
layout (std140) uniform globalUniforms{
layout(row_major) mat4 mvp;
layout(row_major) mat4 vp;
vec3 cameraPos;
float time;
vec3 sun;
};
const int maxLevel=64;
const float maxDistance=100;
int getTessLevel(vec3 p){
float l=distance(p,cameraPos);
return int((maxLevel-1)*(1.0-clamp(l,0,maxDistance)/maxDistance))+1;
}
void main()
{
tc_Position[gl_InvocationID] = ex_Position[gl_InvocationID];
if (gl_InvocationID == 0) {
vec3 d0=ex_Position[0]+(ex_Position[1]-ex_Position[0])/2;
vec3 d1=ex_Position[1]+(ex_Position[2]-ex_Position[1])/2;
vec3 d2=ex_Position[2]+(ex_Position[3]-ex_Position[2])/2;
vec3 d3=ex_Position[3]+(ex_Position[0]-ex_Position[3])/2;
gl_TessLevelOuter[0] = getTessLevel(d0);
gl_TessLevelOuter[1] = getTessLevel(d1);
gl_TessLevelOuter[2] = getTessLevel(d2);
gl_TessLevelOuter[3] = getTessLevel(d3);
gl_TessLevelInner[0] = gl_TessLevelOuter[0];
gl_TessLevelInner[1] = gl_TessLevelOuter[1];
}
}
エラーは TCS シェーダーのどこかにあると思いますが、テッセレーション レベルを計算する正しい方法が見つかりません。
修正
void main()
{
tc_Position[gl_InvocationID] = ex_Position[gl_InvocationID];
if (gl_InvocationID == 0) {
vec3 d0=ex_Position[2]+(ex_Position[2]-ex_Position[1])/2;
vec3 d1=ex_Position[0]+(ex_Position[1]-ex_Position[0])/2;
vec3 d2=ex_Position[3]+(ex_Position[3]-ex_Position[0])/2;
vec3 d3=ex_Position[2]+(ex_Position[3]-ex_Position[2])/2;
gl_TessLevelOuter[0] = getTessLevel(d0);
gl_TessLevelOuter[1] = getTessLevel(d1);
gl_TessLevelOuter[2] = getTessLevel(d2);
gl_TessLevelOuter[3] = getTessLevel(d3);
gl_TessLevelInner[0] = mix(gl_TessLevelOuter[1],gl_TessLevelOuter[2],0.5);
gl_TessLevelInner[1] = mix(gl_TessLevelOuter[0],gl_TessLevelOuter[3],0.5);
}
}