Opengl备忘3---Shaders

opengl3.0 的GLSL跟 opengl2.0 略有不同

着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数

OpenGL确保至少有16个包含4个元素的顶点属性可用

GLint nrAttributes;glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes);std::cout << "Maximum nr of vertex attributes supported: " << nrAttributes << std::endl

可以查询有多少Attribute属性

3.0中可以不适用layout(location = 0) 通过glGetAttribLocation获取地址,这样使用更容易理解而且节省时间


例子:

顶点着色器

#version 330 core

layout (location = 0) in vec3 position; // 位置变量的属性为0

out vec4 vertexColor; // 为片段着色器指定一个颜色输出

void main(){  

gl_Position = vec4(position, 1.0); // 把一个vec3作为vec4的构造器的参数  

vertexColor = vec4(0.5f, 0.0f, 0.0f, 1.0f); // 把输出颜色设置为暗红色

}


片段着色器

#version 330 core

in vec4 vertexColor; // 和顶点着色器的vertexColor变量类型相同、名称相同

out vec4 color; // 片段着色器输出的变量名可以任意命名,类型必须是vec4

void main(){  

color = vertexColor; //

}



代码中使用:

GLfloat timeValue = glfwGetTime();

GLfloat greenValue = (sin(timeValue) / 2) + 0.5;

GLint vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");

glUseProgram(shaderProgram);

glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);


更多属性:

GLfloat vertices[] = { // 位置 // 颜色  

0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // 右下  

-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // 左下  

0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f // 顶部};

此时shader需要传入两个Attribute

layout (location = 0) in vec3 position; // 位置变量的属性position为 0

layout (location = 1) in vec3 color; // 颜色变量的属性position为 1

顶点数据更新也需要响应的得到变化:

// 顶点属性

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);

glEnableVertexAttribArray(0);// 

颜色属性

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3* sizeof(GLfloat)));

glEnableVertexAttribArray(1);



你可能感兴趣的:(Opengl备忘3---Shaders)