1
0
mirror of https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git synced 2025-08-23 12:45:29 +08:00

-更新资源

This commit is contained in:
wuweizhou
2015-06-23 19:17:14 +08:00
parent df10fe28da
commit 0f9ab0b747
2 changed files with 66 additions and 1 deletions

View File

@@ -97,3 +97,68 @@ GLSL跟一般的编程语言一样定义了一些常用的数据类型
可以看到在顶点着色器生命了一个向量*vertexColor* 有out修饰同时在片段着色器声明了一个*vertexColor* 使用in来修饰这样片段着色器就可以获取顶点着色器处理的*vertexColor*的结果了
根据上面shader可以得出下图的效果
![shader效果](https://github.com/codeman001/LearnOpenGL-CN/blob/master/01%20Getting%20started/pic1.jpg?raw=true)
**常量**
常量是另外一个中从CPU端向GPU传输数据的方式常量方式跟顶点数据有非常明显的不同常量有两个特性
1.具有全局性可以在着色器不同阶段来获取同一个常量
2.不变性一旦设置了值在渲染过程中就不能被改变只有从新设置才能改变
声明常量非常简单使用uniform 放在类型和变量名前面即可下面看一个例子
#version 330 core
out vec4 color;
uniform vec4 ourColor; //
code.
void main()
{
color = ourColor;
}
声明了一个ourColor为常量类型然后把它的值付给了输出变量color
注意如果声明了一个从来没用到常量GLSL的编译器会默认删除这个常量由此可能导致一些莫名的问题
现在这个常量还是个空值接下来给ourColor在CPU端传递数据给它思路获取ourColor在索引位置然后传递数据给这个位置另外做一些小动作不传递固定的这个传递一个随时间变化的值如下
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);
首先通过glfwGetTime函数获取程序运行时间秒数)。然后使用sin函数将greenValue的值控制在0-1
然后使用glGetUniformLocation函数查询ourColor的索引位置是一个参数是要查询的着色器程序第二个参数是常量在着色器中声明的变量名如果glGetUniformLocation函数返回-1表明没找到对应的常量的索引位置
最合使用glUniform4f来完成赋值
注意使用glGetUniformLocation 不需要在glUseProgram之后但是glUniform4f一定要在lUseProgram之后因为我们也只能对当前激活的着色器程序传递数据
到目前为止已经学会了这么给常量传递数据和渲染使用这些数据如果我们想每帧改变常量的值我们需要在主循环的不停的计算和更新常量的值
while(!glfwWindowShouldClose(window))
{
// Check and call events
glfwPollEvents();
// Render
// Clear the colorbuffer
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Be sure to activate the shader
glUseProgram(shaderProgram);
// Update the uniform color
GLfloat timeValue = glfwGetTime();
GLfloat greenValue = (sin(timeValue) / 2) + 0.5;
GLint vertexColorLocation = glGetUniformLocation(
shaderProgram, "ourColor");
glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f,1.0f);
// Now draw the triangle
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
}
如果运行正常的话我们能看到一个绿色到黑色黑色到绿色变化的三角形
可以查看完整的代码[实例](http://learnopengl.com/code_viewer.php?code=getting-started/shaders-interpolated)

BIN
01 Getting started/pic2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB