我正在尝试在 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;
}
以下是指数:
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;
}
为了绘制球体,我遵循了这个例子:使用 Visual C++ 在 Opengl 中创建一个 3D 球体,所以所有的功劳都归于他(顺便谢谢你!)。
这是显示结果的两张图片:
如果您有任何可以帮助我解决此问题的提示,那就太好了。谢谢你。注意:如果您需要任何其他信息,请询问我,我会发布它们。