【发布时间】:2015-04-14 16:38:41
【问题描述】:
我正在尝试在 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++ 所以所有的功劳都归他所有(顺便谢谢你!)。
这是显示结果的两张图片:
如果你有任何提示可以帮助我解决这个问题,那就太好了。谢谢你。 注意:如果您需要任何其他信息,请询问我,我会发布它们。
【问题讨论】:
标签: opengl tessellation