2014-11-02 144 views
1

所以我知道如何提供输入到着色器作为数组:的OpenGL着色器输入

GLuint vertexbuffer; 
glGenBuffers(1, &vertexbuffer); 
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); 
//inside loop, provide the shader a layout location 
glEnableVertexAttribArray(0); 
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 

我将如何提供一个浮动作为输入?我已经尝试过在各地搜索谷歌,但没有很多很好的资源记录着色器(至少对于初学者)。此外,我如何使用该输入?难道仅仅是这样的:

layout(location = 0) in vec3 vertPosition //for my position 
layout(location = 1/*or whatever i use*/) in float rotation 
//rest of the code.... 

回答

2

刚刚成立1作为第二个参数:

glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, (void*)0); 

这意味着openGL的多少元素需要传递给着色器(最多4个)。

要通过多种属性,你可以有第一个参数匹配着色器中的属性:

glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, (void*)0); 
如果你想交错的数据,因此缓冲区看起来像

[x, y, z, rotation, x, y, z, rotation,...],那么你将需要以下呼叫:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float)*4, (void*)0); 
glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, sizeof(float)*4, (void*)sizeof(float)*3); 

的wiki有一个很好的说明,关于vertex specification

+0

谢谢您的回答。我如何在代码中使用多个输入(来自多个地方)? (问题的第二部分,对不起,如果它不是很明显:) – 2014-11-02 21:37:38

+0

这是第一个参数,有各种方式将其传递给着色器,一种常用的方法是交错数据,我将编辑答案。 – 2014-11-02 21:48:26

+0

我将如何使用我的glsl中的旋转变量?它将是vec3位置布局(位置= 0)'布局(位置= 1)在vec3旋转' – 2014-11-02 22:33:02