Opengl 球面细分错误坐标

Opengl 球面细分错误坐标,opengl,tessellation,Opengl,Tessellation,我正在尝试在GPU上为一个简单的球体应用细分。这种细分对于简单的平面非常有效,但对于球体却不起作用。当然,我知道坐标映射是不一样的,我尝试了很多方法。例如,我尝试在细分计算中使用gl_TessCoord(x和y)作为映射到平面的经度和纬度。然后将它们转换成球坐标,但它“真的”不起作用 对于“细分”控件,我只是将所有面片拆分为2个外部面片和2个内部面片 以下是我绘制球体的代码: glBindVertexArray(vertexArrayObject); glPatchParameteri(GL_P

我正在尝试在GPU上为一个简单的球体应用细分。这种细分对于简单的平面非常有效,但对于球体却不起作用。当然,我知道坐标映射是不一样的,我尝试了很多方法。例如,我尝试在细分计算中使用gl_TessCoord(x和y)作为映射到平面的经度和纬度。然后将它们转换成球坐标,但它“真的”不起作用

对于“细分”控件,我只是将所有面片拆分为2个外部面片和2个内部面片

以下是我绘制球体的代码:

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);