gpt4 book ai didi

opengl - 使用几何着色器优化立方体渲染

转载 作者:行者123 更新时间:2023-12-03 17:33:04 24 4
gpt4 key购买 nike

在我的第一个 opengl 'voxel' 项目中,我使用几何着色器从 gl_points 创建立方体,它工作得很好,但我相信它可以做得更好。在 alpha 颜色中,我传递有关应该渲染哪些面的信息(以跳过与其他立方体相邻的面),然后使用“引用”立方体定义创建可见面的顶点。每个点乘以 3 个矩阵。本能告诉我,也许整张脸都可以乘以它们而不是每个点,但是我的数学能力很差,所以请指教。

#version 330 
layout (points) in;
layout (triangle_strip,max_vertices=24) out;

smooth out vec4 oColor;
in VertexData
{
vec4 colour;
//vec3 normal;
} vertexData[];

uniform mat4 cameraToClipMatrix;
uniform mat4 worldToCameraMatrix;
uniform mat4 modelToWorldMatrix;

const vec4 cubeVerts[8] = vec4[8](
vec4(-0.5 , -0.5, -0.5,1), //LB 0
vec4(-0.5, 0.5, -0.5,1), //L T 1
vec4(0.5, -0.5, -0.5,1), //R B 2
vec4( 0.5, 0.5, -0.5,1), //R T 3
//back face
vec4(-0.5, -0.5, 0.5,1), // LB 4
vec4(-0.5, 0.5, 0.5,1), // LT 5
vec4(0.5, -0.5, 0.5,1), // RB 6
vec4(0.5, 0.5, 0.5,1) // RT 7
);

const int cubeIndices[24] = int [24]
(
0,1,2,3, //front
7,6,3,2, //right
7,5,6,4, //back or whatever
4,0,6,2, //btm
1,0,5,4, //left
3,1,7,5
);

void main()
{
vec4 temp;
int a = int(vertexData[0].colour[3]);
//btm face
if (a>31)
{
for (int i=12;i<16; i++)
{
int v = cubeIndices[i];
temp = modelToWorldMatrix * (gl_in[0].gl_Position + cubeVerts[v]);
temp = worldToCameraMatrix * temp;
gl_Position = cameraToClipMatrix * temp;
//oColor = vertexData[0].colour;
//oColor[3]=1;
oColor=vec4(1,1,1,1);
EmitVertex();
}
a = a - 32;
EndPrimitive();
}
//top face
if (a >15 )
...
}

-------- 更新代码:-----
//one matrix to transform them all
mat4 mvp = cameraToClipMatrix * worldToCameraMatrix * modelToWorldMatrix;
//transform and store cube verts for future use
for (int i=0;i<8; i++)
{
transVerts[i]=mvp * (gl_in[0].gl_Position + cubeVerts[i]);
}
//btm face
if (a>31)
{
for (int i=12;i<16; i++)
{
int v = cubeIndices[i];
gl_Position = transVerts[v];
oColor = vertexData[0].colour*0.55;
//oColor = vertexData[0].colour;
EmitVertex();
}
a = a - 32;
EndPrimitive();
}

最佳答案

在 OpenGL 中,您不使用面(或线,就此而言),因此您不能将变换应用于面。您需要对构成该面的顶点执行此操作,就像您正在做的那样。

可能的优化是您不需要像您那样分离矩阵转换。如果您在应用程序代码中多次使用它们,并将它们作为单个统一传递到您的着色器中,这将节省一些时间。

另一个优化是在开始时循环转换八个立方体顶点,将它们存储到本地数组,然后在 if 逻辑中引用它们的转换位置。现在,如果您渲染立方体的每个面,您将变换 24 个顶点,每个顶点 3 次。

关于opengl - 使用几何着色器优化立方体渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14560619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com