我通过将索引加载到 VAO 中、设置它们的布局并使用glDrawArrays传递它们,部分实现了按单个索引的呈现
但是现在另一个问题--对于测试,我在着色器本身中创建了数组--
`
#version 330 core
// Positions/Coordinates
layout (location = 0) in int V_Indices;
// Colors
layout (location = 1) in int T_Indices;
// Texture Coordinates
layout (location = 2) in int N_Indices;
vec3 Vertices[8] = vec3[8](
vec3(- 1.000000, -1.000000, 1.000000),
vec3(-1.000000, 1.000000, 1.000000 ),
vec3(-1.000000, -1.000000, -1.000000),
vec3(-1.000000, 1.000000, -1.000000),
vec3( 1.000000, -1.000000, 1.000000),
vec3( 1.000000, 1.000000, 1.000000),
vec3( 1.000000, -1.000000, -1.000000),
vec3( 1.000000, 1.000000, -1.000000));
//
vec2 Texcoords[] = vec2[22](
vec2( 0.333333, 0.333333),
vec2( 0.666667, 0.000000),
vec2( 0.666667, 0.333333),
vec2( 0.000000, 0.666667),
vec2( 0.333333, 0.333333),
vec2( 0.333333, 0.666667),
vec2( 0.000000, 0.333333),
vec2( 0.333333, 0.000000),
vec2( 0.333333, 0.333333),
vec2( 0.666667, 0.666667),
vec2( 0.333333, 0.666667),
vec2( 0.666667, 0.333333),
vec2( 1.000000, 0.000000),
vec2( 1.000000, 0.333333),
vec2( 0.333333, 1.000000),
vec2( 0.000000, 0.666667),
vec2( 0.333333, 0.666667),
vec2( 0.333333, 0.000000),
vec2( 0.000000, 0.000000),
vec2( 0.666667, 0.333333),
vec2( 0.666667, 0.000000),
vec2( 0.000000, 1.000000)
);
vec3 Normals[] = vec3[6](
vec3(-1.0000, 0.0000, 0.0000),
vec3( 0.0000, 0.0000, -1.0000),
vec3( 1.0000, 0.0000, 0.00000),
vec3( 0.0000, 0.0000, 1.00000),
vec3( 0.0000, -1.0000, 0.0000),
vec3( 0.0000, 1.0000, 0.0000)
);
out vec2 texCoord;
uniform mat4 camMatrix;
void main()
{
// Outputs the positions/coordinates of all vertices
gl_Position = camMatrix * vec4(Vertices[V_Indices], 1.0);
// Assigns the colors from the Vertex Data to "color"
// Assigns the texture coordinates from the Vertex Data to "texCoord"
texCoord = Texcoords[T_Indices];
}
`
但在真实的情况下,在着色器中创建数组是行不通的,而且,数组的长度也会不同。问题是-是否有可能将顶点数组加载到VBO中,然后从着色器中获取VBO-作为数组,或者以某种方式通过索引读取其元素?如果没有,那么问题是-是否有可能在着色器中创建动态数组。然后将顶点传递给它?-“uniform int ArrSize”“uniform vec 3 *arr = new vec 3 [ArrSize];
1条答案
按热度按时间b1payxdu1#
Shader Storage Buffer Object最适合此任务:
您可以将缓冲区与以下内容绑定:
尽管SSBO的布局不如VAO灵活,但它们确实允许索引非常大的缓冲区(通常是您可以分配的大小)。
但是,**SSBO是在OpenGL 4.3中引入的,**可能仅通过扩展在早期版本中可用。
如果您希望它与早期的OpenGL版本一起工作,您可以查看Uniform Buffer Objects或Buffer Textures。