假设我正在研究WebGL中的一个问题,该问题需要从大纹理(例如,2048x2048)中检索值,并且像素完美精确.
到目前为止,一切对我来说都很有用.我可以将大纹理传递给片段着色器,片段着色器会将其转换为渲染目标,我甚至可以将渲染目标作为另一个渲染过程的输入,始终检索我需要的精确像素.
但现在让我们说我想混淆一下.我想创建一个渲染过程,它返回一个纹理,为我开始使用的大纹理中的每个像素存储一对uv坐标.作为最简单的用例,让我们说:
precision highp float;
precision highp sampler2D;
varying vec2 vUv;
void main() {
gl_FragColor = vec4(vUv, 0, 1);
}
Run Code Online (Sandbox Code Playgroud)
使用第一个渲染过程返回的uv坐标,我想从我开始使用的大纹理中访问一个像素:
precision highp float;
precision highp sampler2D;
uniform sampler2D firstPass;
uniform sampler2D largeTexture;
varying vec2 vUv;
void main() {
vec2 uv = texture2D(firstPass, vUv);
gl_FragColor = texture2D(largeTexture, uv);
}
Run Code Online (Sandbox Code Playgroud)
然而,这并不能以足够的精度工作.我经常从相邻像素获得颜色,而不是我想要解决的像素.从一些修补我发现这只适用于尺寸高达~512x512的纹理.
您将注意到我已在这些示例中指定使用高精度浮点数和采样器2D.这是关于唯一容易想到的解决方案,但这仍然没有解决我的问题.我知道我总是可以依靠寻找具有较低精度的相对坐标系的像素,但我希望为了简单起见,我仍然可以使用uv进行寻址.
我在我的程序中实现了FreeType,我可以用颜色和样式绘制文本(粗体,斜体,下划线).
现在我想对我的文字进行轮廓效果.我该怎么做?
像http://freetype-gl.googlecode.com/svn/wiki/images/cartoon.png这样的效果
我想再次进行测试:在"大纲"模式下绘制"背景"文本,在常规模式下绘制前景文本.你怎么看待这件事?
http://freetype-gl.googlecode.com/svn/wiki/images/outline.png
我正在使用GPUImage框架开发iOS项目.我不能让我的着色器得到遵守.
我的片段着色器中有一个函数:
const vec2 boundMin = vec2(0.0, 0.0);
const vec2 boundMax = vec2(1.0, 1.0);
bool inBounds (vec2 p) {
return all(lessThan(boundMin, p)) && all(lessThan(p, boundMax));
}
Run Code Online (Sandbox Code Playgroud)
着色器编译日志:
ERROR: 0:1: '_Bool' : syntax error syntax error
Run Code Online (Sandbox Code Playgroud)
当我替换所有调用函数
inBounds(vec2 p)
同
all(lessThan(boundMin, p)) && all(lessThan(p, boundMax))
它很棒!
问题:
OpenGL ES 2.0 Fragment Shader支持bool功能吗?如果是的话,我哪里出错了?如果不是,为什么会出现类似的功能all(),lessThan()等等.
环境:iPad mini,iOS 7,OpenGL ES 2.0,Xcode 5.0.2
我专门为我的应用程序使用OpenGL ES(2.0).我正在尝试UIMotionEffect使用我的一个OpenGL对象 - 我需要的只是"倾斜"值.
UIInterpolatingMotionEffect只能应用于a UIView,而hack将应用于UIInterpolatingMotionEffecta UIView并从每帧中获取值,而不是渲染所谓的UIView.但似乎太过于苛刻,不能成为唯一的解决方案.
我试图继承UIMotionEffect,但无法弄清楚是如何- (NSDictionary *)keyPathsAndRelativeValuesForViewerOffset:(UIOffset)viewerOffset工作的(即什么叫它以及如何检索我需要的值).
关于如何使用UIMotionEffectOpenGL的任何想法?
我正在寻找一种在我正在开发的游戏中最大限度地减少电池使用量,并且电池使用量很难准确测量,所以我希望知道的人能够回答这个问题.
是否值得我实现一个系统,当屏幕上显示的内容没有更新时我不会渲染?就像是
updated = false;
for each component
updated |= component.update();
if (updated)
render();
Run Code Online (Sandbox Code Playgroud)
如果它是值得的,那么这种事情在开始时更容易添加,而不是在需要时尝试添加.
如果我通过CPU渲染,那么我肯定会说它值得做,但通过GPU我不太确定.与屏幕上的东西相比,是否可以节省大量的电池?
编辑: 有点澄清.我正在创建一个文字游戏,所以很多时候用户都会盯着一个不动的屏幕寻找单词.根据正在播放游戏的模式,屏幕上可能会发生一些不是由用户输入触发的事情.例如,屏幕上每5秒出现一个新对象.渲染300帧,每5秒钟没有任何事情发生似乎是一种真正的浪费,这是我想要避免的.
我想制作一个使用OpenGL ES 2.0的应用程序.我可以在不使用GLKit的情况下执行此操作,因为我想将其部署到iOS 4.3吗?我找不到任何关于此的参考.是否可以在没有GLKit的情况下使用着色器等?
谢谢
嗯,问题很简单.在家里我有三台计算机,其中两台很老,带有集成显卡,不支持OpenGL 2.0.现在,我想知道这是否常见,所以我知道我是否应该为Kivy开发,因为OpenGL 2.0似乎是强制性的.
我知道玩游戏的人通常都有能够运行我用Kivy制作的任何应用程序的计算机,但如果它是非游戏应用程序,会不会有很多人无法运行它?
我想在我的OpenGL应用程序中全屏显示图像,而不会失去其宽高比。我知道我可以将图像作为纹理绘制到“立方体”或2d平面上。但是当我只想显示2D图像时,我不确定这是否是最好的方法。
尤其是因为我希望此图像全屏显示而不损失其宽高比。我知道使用ImageView很容易。但我的OpenGL ES应用程序中需要此功能。
但是我不知道该怎么做。有人知道吗?
我有一张地图,为简单起见,我们说它只是一个纹理.在这张地图的顶部,我有一个多边形,表示用户必须遵循的路线.
我想要的是绘制多边形黑色之外的所有东西.或者,当然只在多边形内绘制东西.
为了更好地解释,我拍了一张照片.蓝线定义多边形,每个角都是多边形中的一个点.带有黄色线条的红色是我想要从图片中变黑的部分,只留下带有紫色线条的红色.多边形从A开始,到B结束.

我一直在参考以下HLSL着色器在OpenGL ES 2中绘制Bezier曲线。下面显示了结果:

引用的着色器依赖于if语句来实现效果:
float alpha = (0.5f - sd);
if(alpha > 1f) {
alpha = 1f;
}
else if(alpha < 0f) {
discard;
}
else {
alpha = alpha;
}
gl_FragColor = vec4(uColor.x, uColor.y, uColor.z, alpha);
Run Code Online (Sandbox Code Playgroud)
由于这些会大大降低OpenGL管道中的性能,因此我认为,如果不使用if语句来强制Alpha或丢弃片段,则可以使用钳位函数强制边缘像素小于0f时变得透明。
gl_FragColor = vec4(uColor.x, uColor.y, uColor.z, clamp(alpha, 0f, 1f));
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为侧面像素仍然部分可见:

我的问题是,我是否缺少有关该discard功能的基本知识?为什么零的alpha量完全可见?