LearnOpenGl练习题-着色器
题目地址:着色器 - LearnOpenGL CN
题目一:修改顶点着色器让三角形上下颠倒:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
out vec3 ourColor;
void main()
{
gl_Position = vec4(aPos, 1.0);
gl_Position.y *= -1;
ourColor = aColor;
}
将y轴坐标乘以-1,使最终渲染出的是原坐标位置相对于y轴的镜像
题目二:使用uniform
定义一个水平偏移量,在顶点着色器中使用这个偏移量把三角形移动到屏幕右侧:
C++
代码
float offset = 0.5f;
int uniXOffset = glGetUniformLocation(shaderProgram, "xOffset");
glUniform1f(uniXOffset, 0.5f);
GLSL
代码
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
out vec3 ourColor;
uniform float xOffset;
void main()
{
gl_Position = vec4(aPos, 1.0f);
gl_Position.x += xOffset;
ourColor = aColor;
}
使用
uniform
接收偏移量,增加到x
轴实现左右偏移;
题目三:使用out
关键字把顶点位置输出到片段着色器,并将片段的颜色设置为与顶点位置相等(来看看连顶点位置值都在三角形中被插值的结果)。做完这些后,尝试回答下面的问题:为什么在三角形的左下角是黑的?
提供的数据
//顶点输入
float 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 // 顶部
};
GLSL
代码
//顶点着色器
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
out vec3 ourPosition;
void main()
{
gl_Position = vec4(aPos, 1.0);
//将输出信息修改成坐标信息
ourPosition = aPos;
}
================= 分割线 ====================
//片段着色器
#version 330 core
out vec4 FragColor;
//这里获取的输入信息被修改成了坐标信息
in vec3 ourPosition;
void main()
{
FragColor = vec4(ourPosition, 1.0);
}
效果图
因为左下角的坐标为
(-0.5f, -0.5f, 0.0f)
,负数被视为0
相当于最终的颜色向量为(0.0f, 0.0f, 0.0f)
,所以最终左下角的颜色呈现为黑色;
因为左下角的坐标为
(-0.5f, -0.5f, 0.0f)
,负数被视为0
相当于最终的颜色向量为(0.0f, 0.0f, 0.0f)
,所以最终左下角的颜色呈现为黑色;