我正在寻找并行化一些复杂的数学,而webgl看起来是完美的方式.问题是,你只能从纹理中读取8位整数.理想情况下,我希望从纹理中获取32位数字.我有想法使用4个颜色通道获得每像素32位,而不是4位8位.
我的问题是,glsl没有"%"运算符或任何按位运算符!
TLDR:如何使用glsl中的运算符将32位数转换为4位数.
关于该技术的一些额外信息(使用按位运算符):
我在使用非常量int作为索引访问片段着色器中的数组时遇到问题.我删除了公式,因为它无论如何都没有多大意义,但我的代码是基于当前像素计算tileID并使用它来确定颜色.
这是我的代码:
int tileID = <Insert formula here>;
vec3 colorTest;
int arrayTest[1024];
for (int x = 0; x < 1024; x++) {
if (x == 1) arrayTest[x] = 1;
else arrayTest[x] = 2;
}
if (arrayTest[tileID] == 1) colorTest = vec3(0.0, 1.0, 0.0);
else if (arrayTest[tileID] == 2) colorTest = vec3(1.0, 0.0, 0.0);
else colorTest = vec3(0.0, 0.0, 0.0);
Run Code Online (Sandbox Code Playgroud)
显然GLSL不喜欢这个,我得到错误:
'[]':索引表达式必须是常量
有谁知道我会如何解决这个问题?谢谢.
我正在尝试编写一个紧凑而简单的噪声功能,严格限制FP16.这是什么,我就出来了,到目前为止,但我觉得某处操作的数量变得太小FRACT或罪,因为在GPU,我必须写这篇文章,这些都是内FP16限制.关于我做错什么的任何想法?顺便说一句,我不能使用时间变量,也不能使用样本噪声纹理.我需要正确的功能必须紧凑,小巧且自给自足,并产生简单的颗粒噪声效果.注意:下一个算法适用于任何桌面GPU卡,但在" MALI 400 MP "GPU 上完全失败,因为这个浮点值具有FP16限制.
vec3 noise(vec3 color)
{
float variation = length(color);
float dot_product = dot(variation, -0.577350269);
float sin_result = sin(dot_product) * 1.19245;
float random = fract(sin_result);
return color + vec3(random);
}
Run Code Online (Sandbox Code Playgroud)
如果任何人可以为GLSL-ES推荐任何其他随机功能,但严格遵守FP16限制,也会很棒.我知道其他随机实现,例如单纯形噪声,但是这些对于我需要做的事情来说太大而且速度太慢.因此Perlin和Simplex噪声算法不是一种选择.
我一直试图找到一个明确的答案,但似乎没有人明确提出这个问题.
我可以在WebGL Chrome,Firefox,Safari,IE等中使用1D采样器和1D纹理吗?
编辑
可以理解的是1确实是2的幂(2 ^ 0 = 1)意味着您可以有效地使用2D采样器和纹理,使用高度1和宽度256或512等来复制1D纹理.
1D纹理不是没有实际意义,它们的存在是因为它们不仅有目的,而且旨在转化为GPU本身的优化(而不是2D纹理).请记住,每个参数都需要时间加载到调用堆栈,几乎所有GPU编程都是优化每个可能操作的技术.
计算着色器经常需要单个浮动列表而没有额外的维度,使用1D纹理和采样器提供了强类型提供的相同清晰度.即,在1D结构中表示1D数据,并且在2D结构中表示2D数据.它还删除了索引到行/列转换所需的额外操作.
问题不在于他们是否有充分理由,而是支持他们.
在WebGL的1.0基于OpenGL ES 2.0的作为09/MAY/2014
我是很新的OpenGL的.
我正在尝试绘制纹理四边形(2个三角形).纹理的大小是900x900px.我对一个四边形没有任何问题但是当我试图绘制5-10个四边形时,我看到明显的减速.
也许我做错了什么......
码:
public void onDrawFrame(GL10 gl) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
... matrix calculation ...
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
}
Run Code Online (Sandbox Code Playgroud)
顶点着色器:
uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
attribute vec2 a_TexCoordinate;
varying vec2 v_TexCoordinate;
void main() {
gl_Position = uMVPMatrix*vPosition;
v_TexCoordinate = a_TexCoordinate;
}
Run Code Online (Sandbox Code Playgroud)
片段着色器:
precision mediump float;
uniform sampler2D u_PreviewTexture;
varying vec2 v_TexCoordinate;
void main() {
vec4 color = texture2D(u_PreviewTexture, v_TexCoordinate);
gl_FragColor = color;
}
Run Code Online (Sandbox Code Playgroud)
测试平台是Galaxy S3.在分析器中,我看到大约60ms需要eglSwapBuffers调用.
如何快速绘制具有大纹理的四边形?
我正在尝试在片段着色器中旋转纹理,而不是使用顶点着色器和矩阵变换.
旋转的枢轴位于中心.
当在具有方形形状的四边形中渲染时,该算法工作正常,但是当四边形具有矩形形状时,渲染结果变得混乱.有谁能发现问题?
谢谢
varying vec2 v_texcoord;
uniform sampler2D u_texture;
uniform float u_angle;
void main()
{
vec2 coord = v_texcoord;
float sin_factor = sin(u_angle);
float cos_factor = cos(u_angle);
coord = (coord - 0.5) * mat2(cos_factor, sin_factor, -sin_factor, cos_factor);
coord += 0.5;
gl_FragColor = texture2D(u_texture, coord);
}
Run Code Online (Sandbox Code Playgroud) 我目前正试图让这个散景着色器与GPUImage一起使用:http://blenderartists.org/forum/showthread.php?237488-GLSL-depth-of-field-with-bokeh-v2-4-(update )
这就是我现在所拥有的:
precision mediump float;
varying highp vec2 textureCoordinate;
varying highp vec2 textureCoordinate2;
uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2;
uniform float inputImageTextureWidth;
uniform float inputImageTextureHeight;
#define PI 3.14159265
float width = inputImageTextureWidth; //texture width
float height = inputImageTextureHeight; //texture height
vec2 texel = vec2(1.0/width,1.0/height);
//uniform variables from external script
uniform float focalDepth; //focal distance value in meters, but you may use autofocus option below
uniform float focalLength; //focal length in mm
uniform float fstop; //f-stop value
bool …
Run Code Online (Sandbox Code Playgroud) 我已经看到了基于它们在屏幕空间或其本地对象空间中的位置的颜色片段的解决方案,如Three.js/GLSL - 将像素坐标转换为世界坐标.
那些正在使用屏幕坐标,并在相机移动或旋转时进行更改; 或仅适用于本地对象空间.
我想要完成的是基于它们position
的世界空间(如在three.js场景图的世界空间中)对片段进行着色.
即使相机移动,颜色也应保持不变.
希望行为的示例:位于(x:0,y:0,z:2)世界空间中的1x1x1立方体将使其第三个组件(蓝色== z)始终在1.5 - 2.5之间.即使相机移动也应如此.
到目前为止我得到了什么:
顶点着色器
varying vec4 worldPosition;
void main() {
// The following changes on camera movement:
worldPosition = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
// This is closer to what I want (colors dont change when camera moves)
// but it is in local not world space:
worldPosition = vec4(position, 1.0);
// This works fine as long as the camera doesnt move:
worldPosition = modelViewMatrix * …
Run Code Online (Sandbox Code Playgroud) 在glsl es 2.0中没有逆命令
但是我看到我可以1.0/mat2.但我担心这只会明智地划分成分.或不?
但如果是这样,有没有一些技巧(快1 /快)?
有没有人成功使用带有three.js库的GLSL 3 ES着色器?据我所知,最新版本(r68)是不可能的,因为人们甚至无法设置指令(这是必需的,并且必须在着色器代码之前的任何其他内容之前):
#version 300 es
Run Code Online (Sandbox Code Playgroud)
因为由three.js添加到每个着色器的前缀.
有谁知道解决这个问题?是否足以更改three.js代码以将指令附加到threejs着色器前缀的开头?