问题标签 [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.

0 投票
1 回答
1286 浏览

graphics - OpenGLES2 着色器:照明位置和相机移动?

我尝试按照http://www.learnopengles.com/android-lesson-two-ambient-and-diffuse-lighting/上的教程为我的 OpenGLES2 应用程序添加照明

与上面的教程不同,我有 FPS 摄像机运动。在顶点着色器中,我在世界坐标中有硬编码的摄像机位置 (u_LightPos)。但是当我移动摄像机时,它会产生奇怪的照明效果。我必须使用投影/转换这个位置吗?查看矩阵?

0 投票
1 回答
4326 浏览

opengl - 使用 GLSL 渲染矩形纹理

我创建了一个将视频帧(在 Mac 上)渲染到自定义帧缓冲区对象的类。作为输入,我有一个 YUV 纹理,并且我成功创建了一个片段着色器,它将 3 个矩形纹理作为输入(每个用于 Y、U 和 V 平面,其数据由 glTexSubImage2D 使用 GL_TEXTURE_RECTANGLE_ARB、GL_LUMINANCE 和 GL_UNSIGNED_BYTE 上传) ,在渲染之前,我将活动纹理设置为三个不同的纹理单元(0、1 和 2)并为每个纹理绑定一个纹理,出于性能原因,我使用了 GL_APPLE_client_storage 和 GL_APPLE_texture_range。然后我使用 glUseProgram(myProg)、glBegin(GL_QUADS) ... glEnd() 渲染它。

效果很好,我得到了预期的结果(除了闪烁效果,我猜这与我在两个不同的线程上使用了两个不同的 GL 上下文有关,我想它们在某些时候会互相影响[这是稍后另一个问题的主题])。无论如何,我决定通过添加顶点着色器来进一步改进我的代码,这样我就可以跳过 glBegin/glEnd - 我读到的已经过时了,无论如何都应该避免。

因此,下一步我创建了两个缓冲区对象,一个用于顶点,一个用于纹理坐标:

然后在加载着色器后,我尝试检索顶点着色器中属性的位置:

这给了我 0 的 texCoord 和 1 的位置,这似乎很好。

得到属性后我也调用

(我只做一次,还是必须在每个 glVertexAttribPointer 和 glDrawArrays 之前完成?是否需要每个纹理单元完成?或者当我的着色器被 glProgram 激活时?或者我可以在任何地方做吗?)

之后我更改了渲染代码以替换 glBegin/glEnd:

但是自从将代码更改为此,我总是只会得到黑屏。所以我想我错过了一些简单的步骤,也许是一些 glEnable/glDisable 或正确设置一些东西 - 但就像我说我是新手,所以我真的不知道。供您参考,这里是顶点着色器:

我的猜测是我在这里遗漏了一些明显的东西,或者只是对这里正在进行的过程还没有足够深入的了解。我也尝试使用 OpenGLShaderBuilder,它帮助我获得了正确的片段着色器的原始代码(这就是我没有在这里发布它的原因),但是由于添加了顶点着色器,它也没有给我任何输出(想知道如果它不知道 position/texCoord 属性,它怎么知道如何产生输出?)

0 投票
1 回答
257 浏览

c - CGFX着色器多次输出顶点数据

如何多次从顶点着色器输出到像素着色器。例如,在对顶点着色器中的顶点颜色执行一些不同的数学运算后,我需要将顶点颜色作为浮点数 4 输出到像素着色器 4 次?

我可以这样做吗?我尝试创建一个空的 float4 color2,从 In.color 读取 In.vertcolor 并输出...我没有收到任何错误,但我的纹理是白色的。它只是读取任何空的浮点数 4 ......

这是我本节的代码。谢谢!

0 投票
1 回答
218 浏览

directx - 网格的顶点结构与顶点着色器的顶点结构

[使用 HLSL、*.fx 文件和 DirectX9]

我是使用着色器的新手,并且有一个场景可以工作,但不明白为什么。我对网格如何具有一个版本的顶点减速而着色器可以定义另一个版本感到困惑。

我用 来创建一个ID3DXMesh球体D3DXCreateSphere(...),它是用 来设置的D3DFVF_XYZ | D3DFVF_NORMAL。我调用ID3DXMesh::DrawSubset(0)渲染;在 BeginPass/EndPass 调用中。

然后我有一个定义了结构的顶点着色器:

和着色器本身:

虽然我认识到 lightDir 和 textureCoords 在我设置它们之前也可能为空,但 DirectX 实际上在该Vertex original参数中提供了哪些数据?

只是位置?我注意到它float3 _normal:NORMAL是作为一个单独的参数提供的,但是这个值也在original着色器的开头吗?

0 投票
1 回答
1974 浏览

webgl - 三.js ParticleSystem 创建给出 INVALID_OPERATION: not bound BUFFER_ARRAY

我正在尝试使用以下代码创建一个three.js ParticleSystem。在我安装在 Linux 主机上的 Chrome 上,这工作得非常好,但是当我尝试在 Windows Chrome 便携式设备上运行它时,我在第一次渲染调用时收到以下 WegGL 错误:

WebGL:INVALID_OPERATION:vertexAttribPointer:没有绑定ARRAY_BUFFER WebGL:INVALID_OPERATION:drawArrays:属性设置不正确

...来自着色器配置的片段:...

... 创建粒子系统 ....

我不知道为什么 VBO 未绑定或无法绑定。到目前为止我发现的与该主题相关的问题:

  1. https://github.com/mrdoob/three.js/issues/1985
  2. https://github.com/mrdoob/three.js/issues/2073

但两者似乎都不适用于我的情况。

任何帮助将不胜感激;)

0 投票
2 回答
2312 浏览

android - 顶点着色器不在galaxy tab10(tegra 2)上运行

我在 HTC Desire S 上创建了一个使用 GLES2.0 的应用程序。它适用于 HTC,但不适用于三星 Galaxy tab10.1。该程序无法链接(GLES20.glGetProgramiv(mProgram, GLES20.GL_LINK_STATUS, linOk,0) 给出-1)并且 glGetError() 给我一个错误 1282(无效操作)。

当我替换这条线(在着色器中)时:

经过

它也适用于银河选项卡。我的着色器看起来像这样:

那是附加着色器的地方:

纹理在这里加载:

0 投票
1 回答
429 浏览

opengl - 从 Cg 顶点着色器获取 GlProgram 二进制文件

我有一些 Cg 顶点着色器,并希望从中获取已编译的二进制文件以进行缓存。

我加载 Cg 顶点的方式是使用 glProgramStringARB,问题是我无法从 glGetProgramiv 和 glGetProgramBinary 检索任何值。

这是我正在做的示例代码:

我用 -10 初始化长度只是为了看看变量是否会随着 glGetProgramiv 调用而改变,但我总是得到 -10 作为结果。

0 投票
2 回答
5884 浏览

opengl - 片段着色器中“out”变量的名称

在阅读 OpenGL SuperBible 时,我在理解最基本(平面)着色器示例中的一行时遇到了一些问题。

在第 6 章的清单 6.4 和 6.5 中,它介绍了以下两个非常基本的着色器。

6.4顶点着色器

6.5片段着色器

我的困惑是它vFragColor在 out 声明中说,而gl_FragColor在 main() 中说。

另一方面,在网站的代码中,它已被更正为 'vFragColor = vColorValue;' 在主循环中。

我的问题是,除了本书中的错字之外,out着色器命名值的规则是什么?他们必须遵循特定的名称吗?

在 OpenGL.org 上,我发现顶点着色器外需要 gl_Position。片段着色器有这样的东西吗?或者只是如果只有一个输出,那么它将是缓冲区中的颜色?

当片段着色器中有多个时会发生什么?GLSL 编译器如何知道在缓冲区中使用哪一个?

0 投票
1 回答
401 浏览

iphone - 为什么我的 iPhone OpenGL-ES 纹理没有覆盖视口?

我有一个大小为 320x320 的方形图像,我从中创建了一个 OpenGL 纹理。我使用最基本的 Vertext 和 Fragment 着色器,我想在整个视图中显示纹理。视图(EAGLView 从 UIView 派生,在许多 OpenGL iOS 示例中都可以找到)的大小也是 320x320。

问题是,图像绘制在左上角,仅覆盖整个视图的 50% 左右。它不会覆盖 100% 的视图。我不知道为什么?

红色方块为 EAGLView

这是我的代码:

顶点着色器。

片段着色器。

0 投票
1 回答
276 浏览

opengl - 变换反馈输入输出大小

我有一个关于 OpenGL 中的变换反馈的小问题。

我的输出是否可能与我的输出不同?让我们说一个像这样的VS:

所以我的输出缓冲区只是新的位置!

或者反过来说,输出多于输入。