今天工作中需要做一个事情:

在shader内部做一些空间距离上的计算,而且需要对所有的点进行计算,符合条件的显示,不符合条件的点不显示。

思路很简单,在vertex shader内知道顶点坐标,进行计算,算好以后判断是否需要显示,例如设置alpha值,那么再将alpha值传给fragment shader,在里面设置alpha的值就好了。

基本代码如下

// vertex shader
#version 300 es
in vec4 vPosition;
in vec2 vTexCoord;
out float alpha;
void main() {alpha = 1.0f;if (vPosition...) {alpha = 0.0f;}
}// fragment shader
#version 300 es
in float alpha;
void main() {// set the color..
}

看起来天衣无缝,逻辑合理,实际运行出现问题。由于我绘制的是一个球形,然后希望部分球面不显示,仅显示部分球面,基本功能确实实现了,但是显示与隐藏的边缘特别的粗糙,有特别大的锯齿。仔细思考一下,绘制球形是从上到下绘制三角形带得到的,出现的锯齿很有可能就是三角形的边。也就是说在计算的时候,很有可能是取了上传的顶点数据来进行计算,而没有对每一个点进行计算,所以只能判断若干顶点,而不是每一个点。

回顾一下 OpenGL 渲染管线的知识,在光栅化阶段,如何根据三个点画出三角形?如何获得每个点的纹理坐标?

通过光栅化将顶点按照拓扑结构渲染到屏幕上。例如,如果我们要绘制一个三角形那就意味着要找出位于三角形内部的所有点。对于这样每一个点,在光栅化过程中都会调用片元处理器对其进行处理。在片元处理器中我们可以通过对纹理进行取样或者使用其他技术来确定像素的颜色。
光栅器在三角形的三个顶点之间执行插值(比如说扫描线算法或者其他技术),并且通过执行片元着色器来“访问”三角形内的每一个像素点。片元着色器会返回此片元的颜色值,光栅器会将这个颜色值更新到颜色缓冲区内并最终显示出来(在通过一些其他测试例如深度测试之后),而从顶点着色器中传出的其他任何变量都不会经历上述步骤。如果片元着色器没有明确的表示要使用那个变量(对于同一个顶点着色器,我们可以有多个片元着色器与之对应),那么一个驱动优化程序将对 VS 进行优化,并丢弃 VS 中的任何只影响该变量的指令(这个特定的程序指的是由一个 VS 和 FS 组合成的 Shader 程序)。然而如果 FS 确实用到这个变量,那么光栅器在光栅化过程会对这个变量进行插值。这通常意味着紧挨着的两个像素之间的值会有一点差异(尽管三角形离相机越远,这种现象会越来越不明显)。

来源

结论:在vertex shader内对顶点做计算是错误的,一定要在fragment shader内,利用OpenGL插值的功能,拿到每一个点的坐标值,再进行计算。

转载于:https://www.cnblogs.com/psklf/p/6180630.html

OpenGL shader 中关于顶点坐标值的思考相关推荐

  1. Unity Shaders and Effects Cookbook (7-2) Surface Shader 中实现 顶点动画

    上一节中说了,在 Surface Shader 中,添加顶点函数,我们可以在 顶点函数中获取到 顶点数据,比如顶点颜色.顶点坐标等. 这一节学习获取顶点坐标,并且修改顶点坐标,来实现顶点动画. 简单介 ...

  2. android drawText()方法中x,y坐标值真正的 意义

    我们在绘制文字的时候是通过canvas的drawText(String text, float x, float y,Paint paint)方法第一个和第四个参数都知道,但是x,y知道传的是什么坐标 ...

  3. 【OpenGL】向Shader中传递数据

    传递顶点属性信息 之前讲过,vertex shader会被每个顶点调用,通常一个顶点会包含很多信息,例如顶点坐标.顶点法向量.纹理坐标等等,我们称这些信息为顶点的属性.在之前的OpenGL版本里,每个 ...

  4. Unity Shader:细分着色器(Tessellation Shader)在Unity顶点着色器中的写法以及各参数变量解释

    图1:在Unity内将sphere细分后 图2:在Unity内将sphere细分后 Unity官网关于细分着色器的资料比较少,只有在Surface Shader中使用的例子.我看了下Surface S ...

  5. Winform中设置ZedGraph鼠标悬浮显示距离最近曲线上的点的坐标值和X轴与Y轴的标题

    场景 Winform中设置ZedGraph鼠标双击获取距离最近曲线上的点的坐标值: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/ ...

  6. arcmap中有火星坐标码_在ArcMap中使用坐标值转换一个CAD文件中的坐标位置

    (2013-04-13 20:51:19) 转 载 ▼ 标签: 股票 分类: GIS 技术研究 您现在的位置 : 首页 -> 知识库 -> ArcGIS Desktop -> 技术文 ...

  7. 【OpenGL】理解VAO、VBO、EBO和 shader中vertex、fragment交互。

    1:首先了解GPU和渲染管道工作原理. 2:解释VAO.VBO.EBO 顶点数组对象:Vertex Array Object,VAO 顶点缓冲对象:Vertex Buffer Object,VBO 元 ...

  8. matlab显示曲线图中某个点的坐标值

    在画好一幅曲线图后,有时候我们需要找出某个坐标的点,可以通过打开数据游标功能,此时鼠标点击的位置就会显示出坐标值,如下图: 此时保存下来的图也会带有显示的坐标值. 如果需要显示多个坐标的值,按住alt ...

  9. C#——设计一个简单的窗体程序,在文本框中输入两个点的坐标值,单击“确定”按钮时显示两点之间的距离。

    要求定义一个Point类,包括 (1)两个私有字段表示两个坐标值. (2)一个构造函数通过传入的参数对坐标值初始化 (3)两个只读属性对坐标值的读取 (4)一个方法包含一个Point类对象作为参数对象 ...

最新文章

  1. NLP入门竞赛,搜狗新闻文本分类!拿几十万奖金!
  2. 结构化数据不应该被人工智能忘之脑后 !
  3. crosstool-ng配置中的Architecture level、Emit assembly for CPU 、Tune for CPU
  4. openssh相关文件传输功能
  5. Service Mesh 在华为公有云的实践
  6. 金融时序预测中的深度学习方法综述!
  7. java数组循环动态赋值_04、Java基础语法(循环嵌套、break、continue、方法、方法的重载、数组动态初始化)...
  8. 【推荐实践】“全能选手”召回表征算法实践.pdf(附下载链接)
  9. New Relic——手机应用app开发达人的福利立即就到啦!
  10. java实现rabbitmq简单队列模型,生产者 消费者 消息队列
  11. 为什么python不能输入中文_一条命令解决mac版本python IDLE不能输入中文问题
  12. 拓端tecdat|R语言非参数模型厘定保险费率:局部回归、广义相加模型GAM、样条回归
  13. MEMS惯性传感器初始姿态角的确定
  14. Vijos 1006
  15. EURA欧瑞E1000系列变频器使用PID实现恒压供水功能的相关参数设置及接线
  16. 使用python,生成符合zipf分布的数据集
  17. ffmpeg h264指南
  18. L1正则化优化问题的一种求解方法
  19. 理想低通滤波器(频率域滤波)
  20. 怎么区分处理器是第几代的

热门文章

  1. java生僻字_Android上显示生僻字的方法
  2. 文本生成,文本数据增强怎么做?
  3. Top1方案源码和数据,腾讯广告受众基础属性预估
  4. 为什么企业越来越重视数据分析与挖掘?
  5. Scrapy 爬取京东商城华为全系列手机评论
  6. 机器学习很难上手和提升?你只差一条学习路径!
  7. php连接mysql执行sql语句_php+mysql 连接服务器、数据库以及执行SQL语句的类库
  8. 最大子串和 python_5. 最长回文子串(Python)
  9. java创建内部面板类_java-RGB调色面板的实现(事件监听器之匿名内部类)
  10. leetcode链表中的两数相加问题