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

网站建设哪里招标网络工程师是干什么的

网站建设哪里招标,网络工程师是干什么的,南阳网站建设口碑,常熟有做网站的网络公司吗本人刚学OpenGL不久且自学,文中定有代码、术语等错误,欢迎指正 我写的项目地址:https://github.com/liujianjie/LearnOpenGLProject LearnOpenGL中文官网:https://learnopengl-cn.github.io/ 文章目录着色器GLSL数据类型输入与输…

本人刚学OpenGL不久且自学,文中定有代码、术语等错误,欢迎指正

我写的项目地址:https://github.com/liujianjie/LearnOpenGLProject

LearnOpenGL中文官网:https://learnopengl-cn.github.io/

文章目录

  • 着色器
  • GLSL
    • 数据类型
    • 输入与输出
    • Uniform
    • 更多属性
  • 我们自己的着色器类

着色器

  • 简介
    • 着色器(Shader)是运行在GPU上的小程序,分别对应渲染管理不同阶段。
    • 着色器是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有通过输入和输出。

GLSL

  • 简介

    • 着色器是GLSL的类C语言写成的
    • 着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。每个着色器的入口点都是main函数。
    • main函数:在这个函数中我们处理所有的输入变量,并将结果输出到输出变量中
  • 结构

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

    说明:

    • 当我们特别谈论到顶点着色器的时候,每个输入变量也叫顶点属性

    • 我们能声明的顶点属性是有上限的,它一般由硬件来决定。

    • OpenGL确保至少有16个包含4分量的顶点属性可用,但是有些硬件或许允许更多的顶点属性,你可以查询GL_MAX_VERTEX_ATTRIBS来获取具体的上限

      xint nrAttributes;glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes);std::cout << "Maximum nr of vertex attributes supported: " << nrAttributes << std::endl;
      

数据类型

类型含义
vecn包含n个float分量的默认向量
bvecn包含n个bool分量的向量
ivecn包含n个int分量的向量
uvecn包含n个unsigned int分量的向量
dvecn包含n个double分量的向量

输入与输出

  • 输入与输出

    in和out:类型和名称要对得上

  • 特殊的顶点着色器阶段

    需要用layout (location = 0)指定输入变量,来源于顶点数据(疑问:这个顶点数据在cpu还是gpu,应该是GPU,因为用了glBufferData从CPU拷贝到GPU上了)

  • 例子

    顶点着色器

    #version 330 core
    layout (location = 0) in vec3 aPos; // 位置变量的属性位置值为0out vec4 vertexColor; // 为片段着色器指定一个颜色输出void main()
    {gl_Position = vec4(aPos, 1.0); // 注意我们如何把一个vec3作为vec4的构造器的参数vertexColor = vec4(0.5, 0.0, 0.0, 1.0); // 把输出变量设置为暗红色
    }
    

    片段着色器

    #version 330 core
    out vec4 FragColor;in vec4 vertexColor; // 从顶点着色器传来的输入变量(名称相同、类型相同)void main()
    {FragColor = vertexColor;
    }
    

Uniform

  • 简介

    是一种从CPU中的应用向GPU中的着色器发送数据的方式

  • 与顶点属性不同

    • uniform是全局的(Global),可以被着色器程序的任意着色器在任意阶段访问
    • 无论你把uniform值设置成什么,uniform会一直保存它们的数据,直到它们被重置或更新
  • 使用例子

    #version 330 core
    out vec4 FragColor;uniform vec4 ourColor; // 在OpenGL程序代码中设定这个变量void main()
    {FragColor = ourColor;
    }
    
    float timeValue = glfwGetTime();
    float greenValue = (sin(timeValue) / 2.0f) + 0.5f;
    int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");
    glUseProgram(shaderProgram);
    // 发送数据
    glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
    

    关键代码

    glGetUniformLocation(); 通过名称查询uniform ourColor的位置值

  • 细节

    OpenGL在其核心是一个C库,所以无法重载,所以每个上传数据给Uniform的函数都不一样

    f函数需要一个float作为它的值
    i函数需要一个int作为它的值
    ui函数需要一个unsigned int作为它的值
    3f函数需要3个float作为它的值
    fv函数需要一个float向量/数组作为它的值

    glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);

    在vertexColorLocation位置上上传4个float

更多属性

  • 顶点数据

    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;   // 位置变量的属性位置值为 0 
    layout (location = 1) in vec3 aColor; // 颜色变量的属性位置值为 1out vec3 ourColor; // 向片段着色器输出一个颜色void main()
    {gl_Position = vec4(aPos, 1.0);ourColor = aColor; // 将ourColor设置为我们从顶点数据那里得到的输入颜色
    }
    
    #version 330 core
    out vec4 FragColor;  
    in vec3 ourColor;void main()
    {FragColor = vec4(ourColor, 1.0);
    }
    
  • 告诉OpenGL如何解读顶点缓冲中的顶点数据

    // 位置属性
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);
    // 颜色属性
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));
    glEnableVertexAttribArray(1);
    
  • 图示

我们自己的着色器类

我只关心读取这段代码

Shader(const char* vertexPath, const char* fragmentPath)
{// 1. 从文件路径中获取顶点/片段着色器std::string vertexCode;std::string fragmentCode;std::ifstream vShaderFile;std::ifstream fShaderFile;// 保证ifstream对象可以抛出异常:vShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);fShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);try {// 打开文件vShaderFile.open(vertexPath);fShaderFile.open(fragmentPath);std::stringstream vShaderStream, fShaderStream;// 读取文件的缓冲内容到数据流中vShaderStream << vShaderFile.rdbuf();fShaderStream << fShaderFile.rdbuf();       // 关闭文件处理器vShaderFile.close();fShaderFile.close();// 转换数据流到stringvertexCode   = vShaderStream.str();fragmentCode = fShaderStream.str();     }catch(std::ifstream::failure e){std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;}const char* vShaderCode = vertexCode.c_str();const char* fShaderCode = fragmentCode.c_str();[...]
  • 代码流程
    • 用了文件输入流:ifstream
    • 打开文件读取数据vShaderStream << vShaderFile.rdbuf();
    • 保存在stringstream类型对象中
    • 然后再转为string,再转为字符数组
http://www.yidumall.com/news/15070.html

相关文章:

  • 网易邮箱企业版青岛seo推广公司
  • 用sublime做的网站属于免费的网络营销方式
  • wordpress安装在哪个文件夹石景山区百科seo
  • 杭州微网站建设免费制作链接
  • 百度seo培训班整站优化多少钱
  • 哪些网站可以接任务做兼职怎么建免费网站
  • 山东省建设科技协会网站首页百度识图在线入口
  • 响应式网站用什么工具做中国seo关键词优化工具
  • 网站备案要营业执照原件吗手机网站建设价格
  • 网站建设销售问你告诉我怎么制作淘宝关键词top排行榜
  • 优秀材料写作网站seo企业优化方案
  • 长沙移动网站建设哪家好外贸网站优化
  • 做网站推广的 什么是开户网络营销的四个步骤
  • 最好的微网站建设公司网站收录教程
  • 制作公司网站的费用长春网站优化流程
  • 网站建设都需要什么技术人员朋友圈广告30元 1000次
  • 东莞网站建设 烤活鱼百度分析工具
  • 上饶做网站的公司搜索引擎关键词快速优化
  • 网站建设 排名朝阳seo搜索引擎
  • 用jsp做网站步骤2023年8月新闻热点事件
  • 深圳新闻网官网seo如何建立优化网站
  • 淘宝做的网站优化北京关键词优化报价
  • 大同工程造价信息网北京网站优化站优化
  • 网站备案个人可以做吗上海百度竞价
  • wordpress 搜索报错长沙竞价优化
  • 网站首页没收录专业北京seo公司
  • 西安企业网站建设网站广告制作
  • 泉做网站的公司免费建设网站平台
  • dw怎样做收藏本网站外链价格
  • 网站搭建服务器需要什么时空seo助手