关于OpenGL中的文本呈现已经有很多问题,例如:
但主要讨论的是使用固定功能管道渲染纹理四边形.当然着色器必须做出更好的方法.
我并不真正关心国际化,我的大部分字符串都是情节刻度标签(日期和时间或纯数字).但是这些图将以屏幕刷新率重新渲染,并且可能会有相当多的文本(屏幕上不超过几千个字形,但足够硬件加速布局会很好).
使用现代OpenGL进行文本渲染的推荐方法是什么?(引用现有软件使用该方法是很好的证据,它运作良好)
由于GPU驱动程序供应商通常不愿意noiseX
在GLSL中实现,我正在寻找"图形随机化瑞士军刀"效用函数集,最好在GPU着色器中进行优化.我更喜欢GLSL,但任何语言代码都可以为我做,我可以将它自己翻译成GLSL.
具体来说,我希望:
a)伪随机函数 - 在[-1,1]或[0,1]上的N维,均匀分布,从M维种子计算出来(理想情况下是任何值,但我可以将种子限制在内比方说,0..1表示统一的结果分配).就像是:
float random (T seed);
vec2 random2 (T seed);
vec3 random3 (T seed);
vec4 random4 (T seed);
// T being either float, vec2, vec3, vec4 - ideally.
Run Code Online (Sandbox Code Playgroud)
b)像Perlin Noise这样的连续噪声 - 再次,N维,+ - 均匀分布,具有约束的值集合,并且看起来很好(配置外观像Perlin级别的一些选项也可能是有用的).我希望签名如下:
float noise (T coord, TT seed);
vec2 noise2 (T coord, TT seed);
// ...
Run Code Online (Sandbox Code Playgroud)
我不太关注随机数生成理论,所以我最急切地想要一个预先制定的解决方案,但我也很感激"这是一个非常好,高效的1D兰特()这些答案,让我解释一下你如何在它上面制作一个好的N维兰特()...".
我正在学习glsl着色,我遇到了不同的文件格式.我见过人们给出他们的顶点和片段着色器.vert
和.frag
扩展.但我也看到.vsh
和.fsh
扩展,甚至两个着色器在一个.glsl
文件中.所以我想知道是否有标准的文件格式,或者哪种方式是'正确的'?
我已经看到这个伪随机数生成器用于在这里和那里引用的着色器:
float rand(vec2 co){
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
Run Code Online (Sandbox Code Playgroud)
它被称为"规范",或"我在网上找到的单行".
这个功能的起源是什么?恒定值是否像它们看起来一样任意或是否有一些艺术选择?有没有讨论这个功能的优点?
编辑:我遇到的这个函数最早的参考是从2008年2月开始的这个档案,原来的页面现在已经从网上消失了.但是那里没有比其他任何地方更多的讨论.
为OpenGL着色器程序设置属性位置时,您将面临两个选项:
链接之前的glBindAttribLocation()以显式定义属性位置.
要么
链接后的glGetAttribLocation()以获取自动分配的属性位置.
使用一个而不是另一个有什么用?
在实践中哪一个(如果有的话)更受欢迎?
什么是Vertex和Pixel着色器?
他们之间有什么区别?哪一个是最好的?
我想留下OpenGL的灯光,然后自己做.我希望我的着色器允许可变数量的灯光.
我们可以在GLSL着色器中声明一组制服吗?如果是这样,我们如何设定这些制服的价值?
从根本上说,我的问题是我不知道OpenGL ES 2.0希望我如何编写和使用多个着色器; 或者如果一个人会这样做甚至是可取的/预期的.
这里的基本问题是:如果我有一个苹果,一块发光的岩石和一个模糊的网格,都在同一个3D世界中,最好用不同的着色器程序绘制但是使用相同的mvpMatrix然后我将如何使用它们相同的OpenGL渲染,以便他们都使用我写的最合适的着色器?
所以我为我的Android游戏编写了一个基本的OpenGL ES 2.0程序,它可以完美地工作,因为它可以将对象的轮廓绘制到屏幕上.但它没有别的; 几乎是因为着色器看起来像这样:
uniform mat4 uMVPMatrix;
attribute vec4 aPosition;
void main() {
gl_Position = uMVPMatrix * aPosition;
}
Run Code Online (Sandbox Code Playgroud)
void main() {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
现在它们非常基本.我没有走得更远的原因是因为我无法弄清楚我是否应该编写一个着色器来应用于我的所有不同对象,或者我是否应该使用多个着色器.如果我应该使用多个着色器来绘制多个不同的对象,那么我该如何以有效的方式去做呢?
我觉得这对于每天都在做OpenGL ES 2.0的人来说必须是基本的知识,所以我希望有人可以回答我的问题或者指出我正确的方向.
我有:
所以我希望我接近理解OpenGL工作流程,但我似乎还没有.
编辑:之后我发现这个很好:
如果您的应用程序是为OpenGL ES 2.0编写的,请不要创建一个具有大量开关和条件的着色器,这些开关和条件执行应用程序渲染场景所需的每个任务.相反,编译多个着色器程序,每个程序执行特定的,重点突出的任务.
我想知道着色器内部的"If-statements"(顶点/片段/像素......)是否真的会降低着色器性能.例如:
使用它更好吗:
vec3 output;
output = input*enable + input2*(1-enable);
Run Code Online (Sandbox Code Playgroud)
而不是使用这个:
vec3 output;
if(enable == 1)
{
output = input;
}
else
{
output = input2;
}
Run Code Online (Sandbox Code Playgroud)
在另一个论坛上有一个关于那个的讨论(2013):http://answers.unity3d.com/questions/442688/shader-if-else-performance.html 这里有人说,If语句真的很糟糕用于着色器的性能.
此外,他们还在讨论if/else语句(2012)中的内容:https: //www.opengl.org/discussion_boards/showthread.php/177762-Performance-alternative-for-if-(-)
也许硬件或着色器编译器现在更好,他们修复了这个(可能不存在)性能问题.
编辑:
在这种情况下,这里假设enable是一个统一变量,它总是设置为0:
if(enable == 1) //never happens
{
output = vec4(0,0,0,0);
}
else //always happens
{
output = calcPhong(normal, lightDir);
}
Run Code Online (Sandbox Code Playgroud)
我想在这里我们在着色器中有一个分支,它会降低着色器的速度.那是对的吗?
制作2个不同的阴影是否更有意义,比如一个用于其他阴影,另一个用于if部分?
从着色器中的深度缓冲区进行采样,返回0到1之间的值,如预期的那样.给定相机的近平面和远平面平面,如何计算此时的真实z值,即距相机的距离?