关于OpenGL中的文本呈现已经有很多问题,例如:
但主要讨论的是使用固定功能管道渲染纹理四边形.当然着色器必须做出更好的方法.
我并不真正关心国际化,我的大部分字符串都是情节刻度标签(日期和时间或纯数字).但是这些图将以屏幕刷新率重新渲染,并且可能会有相当多的文本(屏幕上不超过几千个字形,但足够硬件加速布局会很好).
使用现代OpenGL进行文本渲染的推荐方法是什么?(引用现有软件使用该方法是很好的证据,它运作良好)
我需要调试一个GLSL程序,但我不知道如何输出中间结果.是否可以使用GLSL制作一些调试跟踪(如printf)?
由于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月开始的这个档案,原来的页面现在已经从网上消失了.但是那里没有比其他任何地方更多的讨论.
我看到很多不同的片段着色器,
#version 130
out vec4 flatColor;
void main(void)
{
flatColor = vec4(0.0,1.0,0.0,0.5);
}
Run Code Online (Sandbox Code Playgroud)
并且它们都使用不同的变量来表示"颜色"(在这种情况下flatColor
).那么OpenGL如何知道你想要做什么?
我猜这个有效,因为flatColor
它是唯一定义为的变量out
,但是你被允许添加更多out
变量不是吗?或者那会崩溃吗?
实际上,作为一个测试,我只是运行这个:
#version 330
in vec2 TexCoord0;
uniform sampler2D TexSampler;
out vec4 x;
out vec4 y;
void main()
{
y = texture2D(TexSampler, TexCoord0.xy);
}
Run Code Online (Sandbox Code Playgroud)
无论我使用x
还是使用它都很好y
.
此外,我们有一个预定义的gl_FragColor
.有什么区别,为什么人们通常坚持使用他们自己的变量?
我想将一个值列表发送到片段着色器.它是一个可能很大(几千个项目长)的单精度浮标列表.片段着色器需要随机访问此列表,我想在每个帧上刷新CPU的值.
我正在考虑如何做到这一点:
作为数组类型的统一变量("uniform float x [10];").但是这里似乎有限制,在我的GPU上发送超过几百个值非常慢,而且当我宁愿在运行时更改它时,我还必须对着色器中的上限进行硬编码.
作为高度为1且列表宽度的纹理,然后使用glCopyTexSubImage2D刷新数据.
其他方法?我最近没有跟上GL规范中的所有变化,也许还有一些专门为此目的设计的方法?
我想留下OpenGL的灯光,然后自己做.我希望我的着色器允许可变数量的灯光.
我们可以在GLSL着色器中声明一组制服吗?如果是这样,我们如何设定这些制服的价值?
我正在修补Joost van Dongen的内部映射着色器,我正在尝试实现自我阴影.我仍然无法弄清楚阴影投射光矢量需要的坐标.你可以在这里看到一些有用的演示 我已经附加了光线位置,偏移到相机位置只是为了看看发生了什么,但显然它没有看起来也不错.着色器代码如下.在片段着色器中查找SHADOWS DEV.有问题的向量是:shad_E和shad_I.
顶点着色器:
varying vec3 oP; // surface position in object space
varying vec3 oE; // position of the eye in object space
varying vec3 oI; // incident ray direction in object space
varying vec3 shad_E; // shadow light position
varying vec3 shad_I; // shadow direction
uniform vec3 lightPosition;
void main() {
// inverse veiw matrix
mat4 modelViewMatrixInverse = InverseMatrix( modelViewMatrix );
// surface position in object space
oP …
Run Code Online (Sandbox Code Playgroud) 如何使用OpenGL ES 2.0着色器执行以下图像处理任务?