哪个更好 ?
到具有一个着色器程序有很多制服指定灯使用,或映射做(例如,我需要一个网格被视差映射,并且映射另一个视差/镜面).我会制作一个缓存转移制服的缓存列表,如果需要的话,只需为每个下一个网格更换一些制服.
要 为每个需要的案例设置很多着色器程序,每个案例都有少量制服,如果需要的话,每个网格都使用glUseProgram进行惰性绑定.在这里,我假设网格已正确批处理,以避免冗余切换.
我正在尝试向OpenGL glsl着色器发送一个布尔值.
目前我在着色器中有这个:
uniform bool foo;
Run Code Online (Sandbox Code Playgroud)
我用它来设置它:
glUniform1i(glGetUniformLocation(shader, "foo"), true);
Run Code Online (Sandbox Code Playgroud)
似乎没有glUniform1b
,所以我将其设置为整数.这似乎工作正常.
这种方法有什么问题吗?它是便携式的,还是可以打破其他显卡/驱动程序?我目前正在使用OpenGL 4.3.
我试图在GLSL中围绕着色器,我已经找到了一些有用的资源和教程,但是我一直在为一些应该是根本和微不足道的东西碰壁:我的片段着色器如何检索颜色目前的片段?
你可以通过说明来设置最终颜色gl_FragColor = whatever
,但显然这是一个仅输出值.如何获得输入的原始颜色,以便对其进行计算?这必须在某个地方变量,但如果有人知道它的名字,他们似乎没有在我到目前为止遇到的任何教程或文档中记录它,它正在推动我的问题.
我是OpenGL ES 2.0的新手,无法理解以下最简单的着色器:
attribute vec4 vPosition;
void main()
{
gl_Position = vPosition;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,因为一个位置是一个向量(x, y, z)
,为什么gl_Position是vec4而不是vec3?
我只是想创建一个非常简单的片段着色器,它为网格绘制指定的纹理.我查看了一些自定义片段着色器,它们完成了相同的操作并构建了自己的着色器并支持它周围的JS代码.但是,它只是不起作用.这是我正在尝试运行的代码的工作抽象:
顶点着色器
<script id="vertexShader" type="x-shader/x-vertex">
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix *
modelViewMatrix *
vec4(position,1.0);
}
</script>
Run Code Online (Sandbox Code Playgroud)
片段着色器
<script id="fragmentShader" type="x-shader/x-fragment">
uniform sampler2D texture1;
varying vec2 vUv;
void main() {
gl_FragColor = texture2D(texture1, vUv); // Displays Nothing
//gl_FragColor = vec4(0.5, 0.2, 1.0, 1.0); // Works; Displays Flat Color
}
</script>
Run Code Online (Sandbox Code Playgroud)
场景代码
<script>
// Initialize WebGL Renderer
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
var canvas = document.getElementById('canvas').appendChild(renderer.domElement);
// Initialize Scenes
var scene = new …
Run Code Online (Sandbox Code Playgroud) 我正在研究一个顶点着色器,我想要有条件地删除一些顶点:
float visible = texture(VisibleTexture, index).x;
if (visible > threshold)
gl_Vertex.z = 9999; // send out of frustum
Run Code Online (Sandbox Code Playgroud)
我知道当相邻数据之间几乎没有共性时,分支会破坏性能.在这种情况下,每个其他顶点可能会得到一个不同的"可见"值,这对于本地着色器核心集群的性能(从我的理解)来说是不利的.
我的问题:三元运算符是否更好(无论可读性问题)?
float visible = texture(VisibleTexture, index).x;
gl_Vertex.z = (visible > threshold) ? 9999 : gl_Vertex.z;
Run Code Online (Sandbox Code Playgroud)
如果没有,是否将其转换为有价值的计算?
float visible = texture(VisibleTexture, index).x;
visible = sign(visible - threshold) * .5 + .5; // 1=visible, 0=invisible
gl_Vertex.z += 9999 * visible; // original value only for visible
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来放弃顶点而不依赖于几何着色器?
在此先感谢您的帮助!
对于版本#330,默认的顶点,片段和几何GLSL着色器是什么样的?
我将#version 330
通过Cg编译器使用GLSL版本3.30 NVIDIA,因为这是我的显卡支持的.
使用默认着色器时,我的意思是着色器与图形卡在关闭着色器程序时执行的操作完全相同.
我找不到一个很好的例子#version 330
.一整天都在谷歌搜索.不确定术语默认着色器是否被称为其他类似于普通或基本的东西,如果这就是为什么我找不到它.
对于版本330的书籍的任何建议或链接到330版本的简单初学者教程也会很棒.
#version 110中的普通顶点着色器的示例执行默认的顶点变换
#version 110
void main()
{
gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
}
Run Code Online (Sandbox Code Playgroud)
#version 110中的普通片段着色器的示例将颜色变为红色
#version 110
void main()
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud) 在完成一些没有额外库+ GLSL着色器的"常规"WebGL之后,我开始使用ThreeJS的WebGL渲染器.我正在尝试在我的ThreeJS程序中编写自定义着色器,我注意到ThreeJS负责很多标准的东西,比如投影和模型/视图矩阵.我的简单顶点着色器现在看起来像这样:
// All of these seem to be predefined:
// vec3 position;
// mat4 projectionMatrix;
// mat4 modelViewMatrix;
// mat3 normalMatrix;
// vec3 normal;
// I added this
varying vec3 vNormal;
void main() {
vNormal = normalMatrix * vec3(normal);
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我可以使用哪些其他变量(我假设它们是制服)是为顶点和片段着色器预定义的?例如ThreeJS是否提供光矢量/浅色(当然假设我已经为我的ThreeJS场景添加了一个或多个灯光)?
更新(2014年10月9日):这个问题已经得到了不少观点,用户Killah提到现有的答案不再导致当前版本的three.js的解决方案.我添加并接受了我自己的答案,见下文.
我正在读这篇文章,作者写道:
以下是通过两个简单步骤在每个平台上编写高性能应用程序的方法:
[...]
遵循最佳实践.在Android和OpenGL的情况下,这包括"批量绘制调用","不在片段着色器中使用丢弃"等内容.
我从来没有听说丢弃会对性能等产生不良影响,并且一直在使用它来避免在没有必要时使用详细的alpha时进行混合.
有人可以解释为什么以及何时使用丢弃可能被认为是一种不好的做法,以及discard + depthtest与alpha + blend相比如何?
编辑:在收到关于这个问题的答案后,我做了一些测试,通过渲染背景渐变,顶部有纹理四边形.
if(
gl_FragColor.a < 0.5 ){ discard; }
" 行结尾的片段着色器给出了大约32 fps.首先,我找不到任何适当的社区来发布这个问题所以我选择了这个.我想知道流行的基于webGL的着色器工具的音频着色器是如何工作的,因为即使我明显听说过"普通"GLSL着色器,我第一次听说过用于程序生成音频的着色器,我很惊讶.有线索吗?