在 OpenGL ES 2.0 / GLSL 中,哪里需要精度说明符?

2024-02-29

您要填充值的变量是否决定了您在等号右侧使用的精度?

例如,这里的精度说明符在含义上是否有任何区别:

gl_FragColor = lowp vec4(1);

这是另一个例子:

lowp float floaty = 1. * 2.;
floaty = lowp 1. * lowp 2.;

如果您采用一些浮点数,并从中创建一个向量或矩阵,该向量或矩阵是否会采用您填充的值的精度,或者这些值是否会转换为另一个精度级别?

我认为优化这将最好地回答这个问题:

dot(gl_LightSource[0].position.xyz, gl_NormalMatrix * gl_Normal)

我的意思是,如果你想要尽快完成,是否需要走这么远,或者其中一些是无用的?

lowp dot(lowp gl_LightSource[0].position.xyz, lowp gl_NormalMatrix * lowp gl_Normal)

我知道您可以定义浮点数的默认精度,并且这应该用于之后的向量和矩阵。出于教育目的,假设我们之前已经定义过:

precision highp float;

  1. 您不需要常量/文字的精度说明符,因为它们的编译时间会根据它们被分配的内容进行评估。

  2. 在顶点着色器中,默认声明以下精度:( 4.5.3 Default Precision Qualifiers)

     precision highp float;
     precision highp int;
     precision lowp sampler2D;
     precision lowp samplerCube;
    

在片段着色器中你会得到:

    precision mediump int;
    precision lowp sampler2D;
    precision lowp samplerCube;

这意味着如果你在片段着色器中声明一个浮点数,你必须说明它是否是一个lowp or a mediump。默认float/int精度也扩展到矩阵/向量。

  1. highp仅在具有以下功能的系统上受支持GL_FRAGMENT_PRECISION_HIGH宏定义为1;其余的你会得到一个编译器错误。 (4.5.4 Available Precision Qualifiers)

  2. 表达式中的精度规则是它们自动转换为它们所绑定的赋值/参数的类型。因此,对于您的点,默认情况下它将使用输入类型的精度以及附加的精度lowp是不必要的(并且语法上不正确)。如果要将类型向下转换为较低的精度,唯一的方法是将其显式分配给较低的精度。

这些答案均来自 Khronos GLSL 规范,您可以在此处找到(相关部分为 4.5.2 和 4.5.3):https://www.khronos.org/registry/OpenGL/specs/es/2.0/GLSL_ES_Specification_1.00.pdf https://www.khronos.org/registry/OpenGL/specs/es/2.0/GLSL_ES_Specification_1.00.pdf

在该规范的最新版本中,这些部分是 4.7.3 和 4.7.4。除了添加默认值外,没有任何更改precision highp atomic_uint;到两个列表。看https://www.khronos.org/registry/OpenGL/specs/es/3.2/GLSL_ES_Specification_3.20.pdf https://www.khronos.org/registry/OpenGL/specs/es/3.2/GLSL_ES_Specification_3.20.pdf

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 OpenGL ES 2.0 / GLSL 中,哪里需要精度说明符? 的相关文章

  • 使用 OpenGL ES 2.0 进行模板制作

    I am trying to figure out a way to cut out a certain region of a background texture such that a certain custom pattern i
  • 纹理不绘制

    我想在屏幕上绘制图像 但我得到的是黑色方块 但上面没有纹理 图像路径正确并已加载 因为矩形具有正确的大小 我有一个单独的类用于加载名为 Texture 的纹理 还有一个用于绘制名为 Sprite 的纹理的类 这是代码 Class Textu
  • Nexus S 上的 OpenGL ES 黑色纹理

    在 Nexus One 上运行的 OpenGL 代码在 Nexus S 上无法正常运行 纹理似乎没有渲染 纹理应该在的地方只剩下黑色 有人有什么想法吗 The 此处给出的已接受答案 https stackoverflow com quest
  • 如何使用 OpenGL ES 2.0 着色器完成这些图像处理任务?

    如何使用 OpenGL ES 2 0 着色器执行以下图像处理任务 色彩空间变换 RGB YUV HSL Lab 图像的旋转 转换为草图 转换为油画 我刚刚向我的开源添加了过滤器GPU图像框架 https github com BradLar
  • 在android中使用OpenGL在按钮上单击绘制形状

    作为 android OpenGL 部分的新手 我已经下载了现场给出的示例使用 OpenGL ES 显示图形 http developer android com training graphics opengl index html so
  • 对数/线性 Z 缓冲区阴影贴图

    问题在于 伪影出现在距离很远的阴影中 我想尝试制作一个对数深度缓冲区 但我不明白应该在哪里完成以及如何完成 我对全向阴影贴图使用点光源方法 顶点着色器 version 460 core layout location 0 in vec3 a
  • 如何在 WebGL 中创建合适的圆角矩形?

    我试图实现答案这个问题 https stackoverflow com questions 43970170 bordered rounded rectangle in glsl但似乎有点问题 如果您打开他们的 ShaderToys 并尝试
  • 如何通过着色器管道传递顶点颜色?

    我试图通过顶点 几何和片段着色器传递顶点颜色 glBegin GL POINTS glVertex3f 2 0f 0 0f 0 0 glColor3f 0 0 1 0 0 0 glVertex3f 2 0f 0 0f 0 0 glColor
  • 在 OpenGL 着色器中检测 NaN 的最佳方法

    今天早上我遇到了一个似乎神秘的错误 我很幸运能够很快找到解决方案 我除以计数器以生成片段着色器内部的平均值 当然 当计数器为零时 所得的颜色值变为 NaN 在混合过程中 NVidia 优雅地将 NaN 视为 0 值 但 Intel 没有这样
  • 未修改的 iOS7 Apple GLPaint 示例混合问题

    在苹果的GLPaint https developer apple com library ios samplecode GLPaint Introduction Intro html例如 用户可以使用半透明画笔在表面上绘图并改变颜色 然而
  • 我什么时候应该调用 CVPixelBufferLockBaseAddress 和 CVPixelBufferUnlockBaseAddress?

    在 iOS6 中 我使用 OpenGL 在 AVFoundation 视频帧上进行一些渲染 我看过很多使用 CVPixelBufferLockBaseAddress 和 CVPixelBufferUnlockBaseAddress 的示例代
  • GLSL - 计算表面法线

    我有一个用 GLSL 编写的简单顶点着色器 我想知道是否有人可以帮助我计算表面的法线 我正在 升级 一个平面 所以当前的灯光模型看起来 很奇怪 这是我当前的代码 varying vec4 oColor varying vec3 oEyeNo
  • OpenGL:调试“单通道线框渲染”

    我正在尝试实现论文 单通道线框渲染 它看起来很简单 但它给了我所期望的厚暗值 论文没有给出计算海拔高度的确切代码 所以我按照自己认为合适的方式进行了操作 代码应该将三个顶点投影到视口空间中 获取它们的 高度 并将它们发送到片段着色器 片段着
  • 使用 glDrawElements 时在 OpenGL 核心配置文件中选取三角形

    我正在使用 glDrawElements 绘制三角形网格 并且希望能够使用鼠标单击来拾取 选择三角形 三角形的网格可以很大 在固定功能 OpenGL 中 可以使用 GL SELECT http content gpwiki org inde
  • 使用未声明的标识符“gl_InstanceID”

    大家好 我一直在IOS平台上尝试在OpenGLES2 0中进行实例化绘制 我的渲染代码 glEnableVertexAttribArray glVertexAttribPointer glDrawElementsInstancedEXT G
  • 解决 Three.js / webGL 中的 gl_PointSize 限制

    我正在使用 Three js 创建交互式数据可视化 此可视化涉及渲染 68000 个节点 其中每个不同的节点具有不同的大小和颜色 最初我尝试通过渲染网格来实现此目的 但事实证明这非常昂贵 我当前的尝试是使用 Three js 粒子系统 每个
  • 为什么拥有单独的投影矩阵但结合模型和视图矩阵会有好处?

    当您学习 3D 编程时 您会被告知用 3 个变换矩阵来思考是最简单的 模型矩阵 该矩阵对于每个模型都是独立的 它根据需要旋转和缩放对象 最后将其移动到 3D 世界中的最终位置 模型矩阵将模型坐标转换为世界坐标 视图矩阵 对于大量对象 如果不
  • GLSL NVidia 方形神器

    当 GLSL 着色器在以下 GPU 上生成不正确的图像时 我遇到了问题 GT 430 GT 770 GTX 570显卡760 但在这些上正常工作 英特尔高清显卡 2500英特尔高清4000英特尔4400显卡740MRadeon HD 631
  • OpenGL:伽玛校正图像看起来不线性

    我使用 OpenGL 进行渲染 当我将线性值写入默认帧缓冲区 没有任何伽玛校正 时 它们在我的显示器上显示为线性 这违背了我认为我所知道的关于伽马校正的一切 如下所述 http gamedevelopment tutsplus com ar
  • Android OpenGL ES 支持无处不在?

    我需要了解如果我选择在 OpenGL 而不是 android graphics 中的 android 原生 2D 图形 API 进行绘图 我会损失多少潜在安装量 android 文档似乎暗示 OpenGL ES API 基本上在所有手机上都

随机推荐