ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Learn OpenGL 笔记5.8 Advanced GLSL(GLSL新特性)

2021-12-20 22:01:27  阅读:209  来源: 互联网

标签:GLSL 1.0 16 5.8 OpenGL uniform FragColor vec4 gl


1.Vertex shader variables:(顶点着色器有关)

1.1gl_PointSize(顶点大小)

void main()
{
    gl_Position = projection * view * model * vec4(aPos, 1.0);    
    gl_PointSize = gl_Position.z;    
} 

 1.2 gl_VertexID(顶点ID)

此只读变量保存我们正在绘制的顶点的当前索引。可以用来对顶点进行操作。

2.Fragment shader variables(片元着色器特性)

2.1 gl_FragCoord(片元位置)

 片元x坐标小于400的就显示不同颜色

void main()
{             
    if(gl_FragCoord.x < 400)
        FragColor = vec4(1.0, 0.0, 0.0, 1.0);
    else
        FragColor = vec4(0.0, 1.0, 0.0, 1.0);        
}  

 2.2 gl_FrontFacing(片元朝向)

gl_FrontFacing 变量告诉我们当前片段是正面还是背面的一部分。 例如,我们可以决定为所有背面输出不同的颜色。

#version 330 core
out vec4 FragColor;
  
in vec2 TexCoords;

uniform sampler2D frontTexture;
uniform sampler2D backTexture;

void main()
{             
    if(gl_FrontFacing)
        FragColor = texture(frontTexture, TexCoords);
    else
        FragColor = texture(backTexture, TexCoords);
}  

 2.3 gl_FragDepth(片元深度)

gl_FragCoord 允许我们读取屏幕空间坐标并获取当前片段的深度值,但它是只读变量。 GLSL 为我们提供了一个名为 gl_FragDepth 的输出变量,我们可以使用它来手动设置着色器中片段的深度值。

3.Interface blocks (接口块)

 GLSL 为我们提供了一种叫做Interface blocks接口块的东西,它允许我们将变量组合在一起。 这种接口块的声明看起来很像结构声明,它现在基于块,输入块还是输出块使用 in 或 out 关键字进行声明。

#version 330 core
out vec4 FragColor;

in VS_OUT
{
    vec2 TexCoords;
} fs_in;

uniform sampler2D texture;

void main()
{             
    FragColor = texture(texture, fs_in.TexCoords);   
} 

4.Uniform buffer objects(统一 缓冲 对象)

因为统一缓冲区对象是一个缓冲区,就像任何其他缓冲区一样,我们可以通过 glGenBuffers 创建一个缓冲区,将其绑定到 GL_UNIFORM_BUFFER 缓冲区目标并将所有相关的统一数据存储到缓冲区中。

 相当于一个自定义的uniform

#version 330 core
layout (location = 0) in vec3 aPos;

//定义了一个uniform block layout,其内容会存储在一个特定的buffer中
layout (std140) uniform Matrices
{
    mat4 projection;
    mat4 view;
};

uniform mat4 model;

void main()
{
    gl_Position = projection * view * model * vec4(aPos, 1.0);
}  

std140,使用一种特殊的内存排列方式和偏移量,提升效率


layout (std140) uniform ExampleBlock
{
                     // base alignment  // aligned offset
    float value;     // 4               // 0 
    vec3 vector;     // 16              // 16  (offset must be multiple of 16 so 4->16)
    mat4 matrix;     // 16              // 32  (column 0)
                     // 16              // 48  (column 1)
                     // 16              // 64  (column 2)
                     // 16              // 80  (column 3)
    float values[3]; // 16              // 96  (values[0])
                     // 16              // 112 (values[1])
                     // 16              // 128 (values[2])
    bool boolean;    // 4               // 144
    int integer;     // 4               // 148
}; 

 

标签:GLSL,1.0,16,5.8,OpenGL,uniform,FragColor,vec4,gl
来源: https://blog.csdn.net/u013617851/article/details/122032652

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有