Opengl 球面细分错误坐标
我正在尝试在GPU上为一个简单的球体应用细分。这种细分对于简单的平面非常有效,但对于球体却不起作用。当然,我知道坐标映射是不一样的,我尝试了很多方法。例如,我尝试在细分计算中使用gl_TessCoord(x和y)作为映射到平面的经度和纬度。然后将它们转换成球坐标,但它“真的”不起作用 对于“细分”控件,我只是将所有面片拆分为2个外部面片和2个内部面片 以下是我绘制球体的代码:Opengl 球面细分错误坐标,opengl,tessellation,Opengl,Tessellation,我正在尝试在GPU上为一个简单的球体应用细分。这种细分对于简单的平面非常有效,但对于球体却不起作用。当然,我知道坐标映射是不一样的,我尝试了很多方法。例如,我尝试在细分计算中使用gl_TessCoord(x和y)作为映射到平面的经度和纬度。然后将它们转换成球坐标,但它“真的”不起作用 对于“细分”控件,我只是将所有面片拆分为2个外部面片和2个内部面片 以下是我绘制球体的代码: glBindVertexArray(vertexArrayObject); glPatchParameteri(GL_P
glBindVertexArray(vertexArrayObject);
glPatchParameteri(GL_PATCH_VERTICES, 4);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer);
glDrawElements(GL_PATCHES, indices.length, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
下面是镶嵌计算中的当前代码:
#version 430
layout(quads, fractional_even_spacing, ccw) in;
uniform mat4 u_projectionMatrix;
uniform mat4 u_viewMatrix;
uniform mat4 u_transformMatrix;
uniform float u_radius;
uniform vec3 u_cameraPosition;
void main(void){
vec4 position = gl_in[0].gl_Position;
position.xz += gl_TessCoord.xy * 2.0 - 1.0;
gl_Position = u_projectionMatrix * u_viewMatrix * u_transformMatrix * position;
}
以下是指数:
intindptr=0代码>
for(int r=0; r< mRings-1; r++)
for(int s=0; s<mSectors-1; s++){
indices[indPtr++] = r * mSectors + s;
indices[indPtr++] = r * mSectors + (s+1);
indices[indPtr++] = (r+1) * mSectors + (s+1);
indices[indPtr++] = (r+1) * mSectors + s;
}
for(int r=0;r 对于(int s=0;s,您似乎只获取第一个顶点(位于球体上),然后通过gl_TessCoord.xy水平偏移它(在xz平面上):
vec4 position = gl_in[0].gl_Position;
position.xz += gl_TessCoord.xy * 2.0 - 1.0;
由于您正在生成四边形,因此可以将大小为4个点的gl\u取为。您只在前三个点上进行了测试。因此,您的最终位置可以通过以下方式进行插值:
vec4 a = mix(gl_in[1].gl_Position, gl_in[0].gl_Position, gl_TessCoord.x);
vec4 b = mix(gl_in[2].gl_Position, gl_in[3].gl_Position, gl_TessCoord.x);
gl_Position = projectionMatrix * viewMatrix * transformMatrix * mix(a, b, gl_TessCoord.y);
()
这会解决你的问题
另外,对于法线,请执行以下操作(如果球体是围绕原点生成的):
您好,我假设您想在[n]中说gl\u。gl\u位置
?我会试试,谢谢您的回答。我会让您知道结果的。对不起,我有点赶时间。希望您能明白:)我会编辑我的回答。此外,您可能会在极点上有错误,因为通常会有退化的四边形。基于四边形生成球体不是一个好主意。一个更好的方法是以二十面体为基底,并细分三角形。-这就是所谓的地球圈。当我使用你的解决方案时,它在Z轴上产生了一些奇怪的坐标,所以我认为它没有映射到
中良好的gl_<[2]
中的code>gl_用于y
和[3]
中的gl_用于z
和gl_在[0]
或[1]
中用于x轴,现在它产生了这样的结果:几乎就是它!我觉得这和指数有关,你知道吗?谢谢你的帮助
vec3 normal = mat3x3(viewMatrix*transformMatrix) * normalize(position.xyz);