我正在尝试在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++所以所有的归功于他(顺便说一句,谢谢你!)。
以下是显示结果的两张图片:
如果你有任何可以帮助我解决这个问题的提示,那真的很酷。谢谢。 注意:如果您需要任何其他信息,请问我,我会发布它们。
答案 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);