着色器-GLSL

文件后缀.vert   // 顶点着色器

文件后缀.frag  // 片段着色器

#version version_number
in type in_variable_name;

out type out_variable_name; uniform type uniform_name; int main() { // 处理输入并进行一些图形操作 ... // 输出处理过的结果到输出变量 out_variable_name = weird_stuff_we_processed; }

xx.vert

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;

out vec3 outColor;
out vec2 TexCoord;

void main(){
    gl_Position = vec4(aPos, 1.0f);
    outColor = aColor;
    TexCoord = aTexCoord;
}

xx.frag

#version 330 core
out vec4 FragColor;

in vec3 outColor;
in vec2 TexCoord;

uniform sampler2D ourTexture;

void main()
{
    FragColor = texture(ourTexture, TexCoord);
}

顶点着色器与片段着色器通信用关键词in和out.

着色器与cpu通信使用uniform.   uniform vec4 ourColor; // 在OpenGL程序代码中设定这个变量

int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");
glUseProgram(shaderProgram);
glUniform4f(vertexColorLocation, 0.0f, 1.0f, 0.0f, 1.0f);

使用location这一元数据指定输入变量,这样可以在CPU上配置顶点属性.数字0,1,2对应位置,也可以忽略layout (location = 0)标识符,通过在OpenGL代码中使用glGetAttribLocation查询属性位置值(Location)

    // position attribute
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);
    // color attribute
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
    glEnableVertexAttribArray(1);
    // texture coord attribute
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
    glEnableVertexAttribArray(2);

 

posted @ 2020-09-03 17:39  Kylin_170  阅读(316)  评论(0)    收藏  举报