006. GLSL 初步认识
in out
fragment shader和 vertex shader的变量是可以对接的,比如:
在vertex shader里你定义了:
out vec4 color1;
就代表你要输出一个vec4类型的变量,要在fragment shader中接收它你只需要:
in vec4 color1;
但是要注意保持变量类型一致变量名一致
layout (location = n)
#version 450 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTextureCord;
out vec3 myColor;
out vec2 textureCord;
void main() {
gl_Position = vec4(aPos.x, -aPos.y, aPos.z, 1.0);
myColor = aColor;
textureCord = aTextureCord;
}
这里面有个 layout (location = n) 这中间的n其实就是我们的glVertexAttribPointer里面的第一个参数,表示对应的属性编号。你在C++端写得是第几个属性,那么你传进来的值就赋给location所对应的变量。
比如你写个glVertextAttribPointer(0,……); 那么你定义的区域传进来的值都会赋值给aPos这个变量
当然不要忘记应用属性哦:
glEnableVertexAttribArray(int location);
010. Texture的使用
在fragment shader里使用texture,需要一个类似于id的东西。(可以注意到OpenGL里很多id)
// fragment shader
uniform sampler2D texture0;
uniform sampler2D texture1;
然后我们在shaderProgram(QOpenGLShaderProgram)里为他们设置“ID”.
shaderProgram.bind(); // 必须先绑定
shaderProgram.setUniformValue("texture0", 0);
shaderProgram.setUniformValue("texture1", 1);
设置过后我们还需要加载纹理资源
// 类内已声明 QOpenGLTexture *texture0, *texture1;
texture0 = new QOpenGLTexture(QImage(":/texture/Texturelabs_Brick_141S.jpg").mirrored());
texture1 = new QOpenGLTexture(QImage(":/texture/1").mirrored());
// 因为QImage和texture坐标系不一样所以需要mirrored
这样纹理就加载好了
在我们要使用包含这个纹理的shader的时候只需要:
shaderProgram.bind();
texture0->bind(0);
texture1->bind(1);
bind后跟的数字就表示这个纹理对应的id