球体镶嵌错误的坐标

时间:2015-04-14 16:38:42

标签: opengl tessellation

我正在尝试在GPU上为简单的Sphere应用曲面细分。这个曲面细分非常适用于一个简单的计划,但它并不适用于该领域。当然,我知道坐标映射不一样,我尝试了很多方法来做到这一点。例如,我尝试在曲面细分评估中使用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; 
}

以下是指数:

int indPtr = 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; 
}

为了绘制球体,我按照这个例子:Creating a 3D sphere in Opengl using Visual C++所以所有的归功于他(顺便说一句,谢谢你!)。

以下是显示结果的两张图片:

Fist image enter image description here

如果你有任何可以帮助我解决这个问题的提示,那真的很酷。谢谢。 注意:如果您需要任何其他信息,请问我,我会发布它们。

1 个答案:

答案 0 :(得分:0)

看起来你只是拿着第一个顶点(位于球体上),然后只是水平地(在xz平面上)通过gl_TessCoord.xy偏移它:

vec4 position = gl_in[0].gl_Position;
position.xz += gl_TessCoord.xy * 2.0 - 1.0; 

由于您正在制作四边形,因此您将获得4个点的gl_in。你只对前三个人感兴趣。因此,您的最终位置可以通过以下方式进行插值:

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

source

那应该解决你的问题。

P.S。对于法线,请执行以下操作(如果围绕原点生成球体):

vec3 normal = mat3x3(viewMatrix*transformMatrix) * normalize(position.xyz);