您的位置:首页 > 运维架构

笔记:OpenGL SuperBible - First Triangle

2014-10-05 15:31 459 查看
gl_VertexID:

the index of the vertex that is being processed at the time, a special input to the vertex shader.
The gl_VertexIDinput
starts counting from the value given by the1st para ofglDrawArrays()and
counts upwards one vertex at a time forcountvertices (the 3rd para
of glDrawArrays())
built-in variable.
We can use this index to assign adifferent position to each vertex

#version 430 core
void main(void) {
// Declare a hard-coded array of positions
const vec4 vertices[3] = vec4[3](vec4( 0.25, -0.25, 0.5, 1.0), vec4(-0.25, -0.25, 0.5, 1.0),
vec4( 0.25, 0.25, 0.5, 1.0));
// Index into our array using gl_VertexID
gl_Position = vertices[gl_VertexID];
}


modify our rendering function to passGL_TRIANGLESto
glDrawArrays()instead of
GL_POINTS:

// Our rendering function
void render(double currentTime) {
const GLfloat color[] = { 0.0f, 0.2f, 0.0f, 1.0f }; glClearBufferfv(GL_COLOR, 0, color);
// Use the program object we created earlier for rendering
glUseProgram(rendering_program);
// Draw one triangle
glDrawArrays(GL_TRIANGLES, 0, 3);
}


REFERENCE: Ch1, OpenGL SB 6th

附:

P.S. 原本按照教材上的代码,编译是通过的,但是图形始终没有显示。于是考虑应为shader那里的问题。在学习之前运行教材配备的代码时,就遇到这个情况,有一些程序能够正常运行,有一些则没有任何显示。于是我再去看了可以正确显示结果的代码,发现它们的那个OpenGL版本是写到version 410而非430(430那些的都无法正确运行)。因此,我将version 430 改为
410 就OK了。

GLuint compile_shaders(void)
{
GLuint vertex_shader;
GLuint fragment_shader;
GLuint program;
// Source code for vertex shader
static const GLchar * vertex_shader_source[] = {
"#version 410 core \n"
" \n"
"void main(void) \n"
"{ \n"
"const vec4 vertices[3] = vec4[3](vec4( 0.25, -0.25, 0.5, 1.0), \n"
"                                     vec4(-0.25, -0.25, 0.5, 1.0), \n"
"                                     vec4( 0.25,  0.25, 0.5, 1.0)); \n"
//"    gl_Position = vec4(0.0, 0.0, 0.5, 1.0);        \n"
"      gl_Position = vertices[gl_VertexID]; \n"
"} \n"
};
// Source code for fragment shader
static const GLchar * fragment_shader_source[] = {
"#version 410 core \n"
" \n"
"out vec4 color; \n"
" \n"
"void main(void) \n"
"{ \n"
"    color = vec4(0.0, 0.8, 1.0, 1.0);              \n"
"} \n"
};

// Create and compile vertex shader
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, vertex_shader_source, NULL);
glCompileShader(vertex_shader);

// Create and compile fragment shader
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);
glCompileShader(fragment_shader);

// Create program, attach shaders to it, and link it
program = glCreateProgram();
glAttachShader(program, vertex_shader);
glAttachShader(program, fragment_shader);
glLinkProgram(program);

// Delete the shaders as the program has them now
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);

return program;
}
<p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;"><pre name="code" class="cpp">...
// Our rendering function
void render(double currentTime) {
const GLfloat color[] = { 0.0f, 0.2f, 0.0f, 1.0f };
glClearBufferfv(GL_COLOR, 0, color);
// Use the program object we created earlier for rendering
glUseProgram(rendering_program);
// Draw one triangle
glDrawArrays(GL_TRIANGLES, 0, 3);
}
...



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: