当前位置: 首页 > news >正文

OPENGL学习笔记整理(五):着色语言

有些事情本身就是十分奇怪的。在传统上,图形硬件的设计目的是用于快速执行相同的硬编译指令集。不同的计算步骤可以被跳过,参数可以被调整,但计算本身确实固定不变的。然而,随着技术的发展,却越来越变得可以编程了。着色语言,都有些OUT了,CUDA、OPENCL什么的越来越大行其道了。当然,在这里,主要还是介绍着色语言。有些东西很新,但是却不成熟。有些东西很旧,很老土,却仍然很好用,就连OPENGL不带着色语言,现在仍然能做出很好的效果,这也是毋庸置疑的。

传统的或称是旧式的OPENGL渲染管线的操作过程如下,(顶点和它们相关的属性)->(转换)->(光照)->(纹理坐标生成和转换)->(裁剪)->(点、直线、多边形、位图和像素矩阵的光栅化:包括平滑的、宽阔的、剔除和深度偏移的图元)->【片段和它们相关的属性】->(纹理)->(颜色求和)->(雾)->(抗锯齿)->(基于片段的操作:像素拥有权、裁剪测试、alpha测试、模板测试、混合、抖动、逻辑操作和帧缓冲区写入)。

着色语言,是把整个图形管线的中的某些部分独立出来,变成可以编程的,即顶点着色器和片元着色器。(转换)->(光照)->(纹理坐标生成和转换)->(裁剪)的功能交给顶点着色器,纹理)->(颜色求和)->(雾)->(抗锯齿)的功能交给片段着色器。

图形管线的问题,我也是搞了很久之后才有这个概念的,其实也就是这么几个步骤。如果你了解GPU历史的话,或许理解起来会更轻松一些,GPU最初的出现和T&L是紧密联系在一起的,这里的T就是tranform或者translate,具体是哪个单词,我现在忘了,功能就是空间变换,L则显然是LIGHTING了,光照。那么顶点着色器的作用,就是完成T&L中T的所有工作及L的所有空间坐标相关的工作,而片元着色器则是做颜色合成的工作。原先,顶点着色器和片元着色器在硬件上是分开的,现在大家都统一了。

如果你会普通的OPENGL编程,那么你只要稍微修改下自己的思路其实就OK了。你可以想象下,你现在不再是活在三维笛卡尔空间里面的人了,你是活在极坐标当中的,可以活在自己设定的某种规则的空间当中,光照效果也不再是那么固定的了,你可以自己改变。还是看看具体的程序或者会比较容易理解。

下面相关的代码来自 OpenGL SuperBible, Chapter 16, Demonstrates vertex blending,该程序只用到了顶点着色器,vertex shader。

int main(int argc, char* argv[])
{
    GLint i;

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(windowWidth, windowHeight);
    glutCreateWindow("Vertex Shaders Demo");
    glutReshapeFunc(ChangeSize);
    glutKeyboardFunc(KeyPressFunc);
    glutSpecialFunc(SpecialKeys);
    glutDisplayFunc(RenderScene);

    SetupRC();

    // Create the menus
    shaderMenu = glutCreateMenu(ProcessMenu);
    for (i = 0; i < TOTAL_SHADERS; i++)
    {
        char menuEntry[128];
        sprintf(menuEntry, "\"%s\"", shaderNames[i]);
        glutAddMenuEntry(menuEntry, 1+i);
    }

    mainMenu = glutCreateMenu(ProcessMenu);
    {
        char menuEntry[128];
        sprintf(menuEntry, "Choose vertex shader (currently \"%s\")", shaderNames[0]);
        glutAddSubMenu(menuEntry, shaderMenu);
    }
    glutAttachMenu(GLUT_RIGHT_BUTTON);

    glutMainLoop();

    if (glDeleteShader && glDeleteProgram)
    {
        for (i = 0; i < TOTAL_SHADERS; i++)
        {
            glDeleteProgram(progObj[i]);
            glDeleteShader(vShader[i]);
        }
    }

    return 0;
}

转载于:https://www.cnblogs.com/unsigned/p/2054746.html

相关文章:

  • Python3学习笔记16-错误和异常
  • 轻量级node-cache源码分析一波
  • 迭代器失效
  • OSChina 周六乱弹 —— 假如你被熊困到树上
  • 改变像素
  • Unix目录结构的来历
  • Localizing WPF with .resx files
  • 转载:进程上下文、中断上下文及原子上下文
  • fstream, operator, operator
  • 图像检索(2):均值聚类-构建BoF
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • c# is和as的区别
  • 各种面试题 挺好 挺重要 项目中 有用 的地方
  • Nginx 1.正向代理与反向代理
  • C++ 运行单个实例,防止程序多次启动
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • C++入门教程(10):for 语句
  • DOM的那些事
  • ERLANG 网工修炼笔记 ---- UDP
  • OSS Web直传 (文件图片)
  • Python打包系统简单入门
  • spring boot 整合mybatis 无法输出sql的问题
  • Vue UI框架库开发介绍
  • vue-router 实现分析
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • webgl (原生)基础入门指南【一】
  • 机器学习中为什么要做归一化normalization
  • 前端路由实现-history
  • 使用Swoole加速Laravel(正式环境中)
  • 线性表及其算法(java实现)
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 译米田引理
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (八)Spring源码解析:Spring MVC
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二)windows配置JDK环境
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (蓝桥杯每日一题)love
  • (一)Dubbo快速入门、介绍、使用
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • @JSONField或@JsonProperty注解使用
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ajaxupload] - 上传文件同时附件参数值
  • [bzoj1038][ZJOI2008]瞭望塔
  • [C++][数据结构][算法]单链式结构的深拷贝
  • [C++]类和对象【上篇】
  • [ERROR] Plugin 'InnoDB' init function returned error
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART
  • [HDU]2161Primes