问题标签 [vertex-shader]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
opengl-es - 顶点位置三元组如何映射到着色器中的 vec4?
我正在尝试从已经使用 spidergl实现它的示例代码实现 webgl 阴影映射。我正在尝试直接在 WebGL 之上实现它。
我相信我有几乎相似的代码,但我没有得到结果。我已将问题缩小到代码的一小部分。我的着色器代码将a_position
(顶点位置属性)定义为 vec3;而 spidergl 代码将其定义为 vec4。我梳理了 spidergl 代码以了解它们的顶点位置属性(即 xyz 三元组)是如何填充到 vec4 中的。我希望在调用 vertexAttribPointer 时找到诀窍。但是它们传递的大小和步幅的值与预期的一样:3 和 12。我更改了代码来做同样的事情,但我还没有得到相同的结果。
有人可以解释位置三元组映射到的基本机制vec4
吗?我从未见过同时提到 w 以及立方体角的 x,y,z 坐标的代码,但是有些着色器采用a_position
as vec4
。那么 vec4 的第四个浮点数填充了什么?
android - GLSL - 顶点属性中的错误数据
我已经花了 2 天时间试图弄清楚这个问题,但没有用。
我已经使用 opengles2.0 for android 编写了一个 collada 动画渲染器;使用着色器进行蒙皮。代码几乎完成了,它在我的 HTC DesireS 上运行得很好。
但是,当我尝试在带有 PowerVR 芯片组的三叉戟 SetTopBox 上运行相同的程序时,我的几何图形不会显示。经过一天的调试,我发现它正在发生,因为我得到 != -1 作为着色器中的骨骼矩阵索引。
我确认它在我的手机中是 == -1;但在机顶盒中是 != -1。
什么可能是错的?请救我脱离这个大麻烦。
抱歉没有贴出代码。这是顶点着色器。我期望 vec2(boneIndices) 在 [0] 和 [1] 中有 -1;但在 Powervr 上并非如此。
设置属性指针
我的顶点和索引缓冲区
我期望着色器中的索引为-1;但他们不是。
c++ - 在 DirectX 10/11 中从 GPU 获取转换后的顶点
我正在开发的图形引擎出现了一个主要瓶颈,即顶点的矩阵变换(几乎没有静态顶点)。到目前为止,我一直在用 CPU 转换顶点并更新每一帧的顶点缓冲区(数据复制本身是一个小瓶颈,但到目前为止是可控的)。
所以我在想,如果我可以将网格缓冲区保留在 GPU 中,我可以在那里转换顶点并将转换后的一组顶点返回到主内存以进行其他处理(后续处理需要比 GPU 着色器更多的内部连接允许)。这可能会消除当前代码中的瓶颈。
关于如何做到这一点的任何提示?谢谢。
glsl - OpenGLES 2.0:gl_VertexID 等效?
我试图通过动态计算顶点位置来创建一个点网格,基于它们在发送到着色器的顶点数组中的索引。我可以从我的着色器中调用一个等效的 gl_VertexID 变量吗?还是另一种无需向 GPU 发送更多数据即可访问它们在数组中的位置的方法?谢谢,乔希。
这是我的顶点着色器:
flash - 混合不同的 Program3D 会导致某些对象无法渲染
我在使用 Stage3D 时遇到了一些意想不到的事情。我为我的对象制作了两个不同的着色器程序。其中一个程序用于使用纹理位图和 uv 数据。另一个只是使用颜色数据。这两个对象非常不同,因为最终,我将使用纯色和简单的渲染逻辑显示一些内容(如方向线、高光等),而其他内容(如实际对象、背景等)将使用 mipmap 等进行渲染向前。问题是当我使用这两个非常不同的着色器程序时,只有一个可以工作。所以要么出现我所有的纯颜色对象,要么出现我所有的纯纹理对象。显然,我希望两者都出现。
这是纹理对象的 agal 代码:
顶点着色器:
片段着色器:
这些对象的渲染代码如下所示:
这是我用于纯色对象的 agal 代码(即没有纹理):
顶点着色器:
片段着色器:
这些对象的渲染代码如下所示:
由于某种我无法弄清楚的原因,我将不同的数据分配给不同的不同寄存器索引 (va) 的事实导致其中一个渲染过程失败。如果我首先在纹理循环中渲染纹理对象,我所有的彩色对象都会消失,反之亦然。对象将在第一帧正确显示。但是一旦渲染循环第二次播放,就会发生这种意外行为。
我发现如果我通过添加以下内容来修改颜色对象的渲染代码:
有用。但这确实不是一个好的解决方案。我不想知道在我的程序的某个地方,另一个对象正在使用 n 个不同的寄存器进行渲染,所以如果另一个 program3D 实例需要小于 n,我必须将所有那些未使用的 va 设置为 null。此外,如果我为现在需要第 4 个 va 的某个对象(例如发光对象)创建一个新的着色器程序,现在我必须返回并修改所有其他着色器程序以将 va4 设置为 null,以便一切都可以渲染。这是真的吗?当然,我在这里遗漏了一些东西。设置我所有的纹理寄存器(ft)也是如此。
我可以提供更多信息...
glsl - GLSL Shader - 具有透明度的阴影(玻璃板效果)
我已经创建了一个着色器,它能够将图像旋转大约 180° 并用黑色渐变覆盖它,但现在我想创建真正的透明度而不是使用黑色作为我的背景颜色。
这是我到目前为止得到的:
c++ - 没有在opengl中绘制的顶点
我一直无法使用着色器绘制一个简单的顶点指定(类似盒子)的茶壶模型,并带有一些用于平移和旋转的输入。我一遍又一遍地检查了我的 gl 代码和矩阵(-z 上的对象位置、原点处的相机等),但不明白为什么我仍然只是得到一个空白屏幕。为了保持代码简短,我刚刚为我的模型的基本立方体输入了代码(一旦我至少知道我会没事的)。
}
顶点着色器
片段着色器
opengl - 为什么 glGetUniformBlockIndex() 返回 INVALID_INDEX?
我在程序中使用以下顶点着色器,但由于某种原因,glGetUniformBlockIndex(id, "draw2DQuadVS")
返回INVALID_INDEX
.
程序在使用前已正确链接,并传递了正确的 id。此外,没有设置 opengl 错误。有什么解释吗?
opengl - 在顶点着色器中置换顶点
我的代码创建了一个包含许多顶点的网格,然后将它们替换为顶点着色器中高度的随机噪声值。移动使用
工作正常,但这意味着你可以一直走到网格的边缘。
我考虑将相机位置发送到着色器,并让整个位移被它抵消。因此最终的顶点着色器代码:
编辑:我修复了一个缺陷,顶点本身不应该水平位移。
但是由于某种原因,当我运行它并更改相机位置时,屏幕闪烁但没有任何移动。顶点正确地被噪声值置换,着色和一切正常,但置换不移动。
作为参考,这里是 git 存储库:https ://github.com/Orpheon/Synthworld
我究竟做错了什么?
PS:“闪烁”是错误的。就好像在某些位置它不绘制任何东西,而在其他位置它从位置 0 绘制正常场景,所以如果我不停地移动它会闪烁。我可以停在它保持黑色的地方,或者在它保持正常的地方。
opengl - opengl 3.3+ 与 glsl 130 代码不兼容?
我遇到了一个问题,即我的 glsl 130 代码无法在我的现代(ATI 5850)硬件上正常运行,而相同的代码在我拥有的带有 NVIDIA 卡的旧笔记本电脑上运行得非常好。无论 opengl 是什么,情况都是如此我使用的上下文。发生的是向量:in_position、in_colour 和 in_normal 在新硬件上没有正确绑定。看来我被迫在较新的硬件上使用较新版本的 glsl (330)。
这是顶点着色器的 glsl 代码。它相当简单和基本。
会发生以下情况的数据:
不绑定或不完全。这些值被奇怪地扭曲了。根据我的测试,其他一切正常。将版本更改为 330 并使用 location 关键字修复了该问题,但这也使代码与旧版本的 opengl 不兼容...
这是我用来指定这些位置的代码示例。
对于程序:
以及后来的数据本身:
我的问题是:opengl 不应该向后兼容吗?我开始担心我必须为每个版本的 opengl 编写单独的着色器,以使我的程序在不同的硬件上运行......因为绑定这些属性是非常基本的功能,我怀疑这是 ATI 实现中的错误...