这些天我一直试图实现着色器功能,但我找不到解决方案。我不确切知道着色器支持的状态,所以我不知道我要问的是否可能:
1.-如何将值数组传递给着色器。
我发现有一些为网络写的功能但不是原生的。例如:
setUniformLocationWith2fv
这可能是我想要的,但它没有在原生中定义。有没有办法将浮点数组传递给着色器? 统一的目标是这样的:统一的vec2位置[30];
2.-或者1.要传递具有个性化值的纹理也很棒。
所以现在我的问题是如何创建纹理(1D或者不可能是2D或3D),并将其作为统一传递。
我看不到创建纹理的ogl测试,但它似乎不是cc.Texture2D
var texture = this.my_texture = gl.createTexture();
gl.bindTexture( gl.TEXTURE_2D, texture );
var pixels = new Uint8Array(4096);
for( var i=0; i<pixels.length; ) {
pixels[i++] = i/4; // Red
pixels[i++] = i/16; // Green
pixels[i++] = i/8; // Blue
pixels[i++] = 255; // Alpha
}
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 32, 32, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.bindTexture(gl.TEXTURE_2D, null);
3.-我想要的是抛弃精灵的某些像素以查看背后的内容,我不知道是否有更好的方法来执行此操作,而不是使用着色器。
编辑:我解释了我真正想要的东西。我想要的是通过鼠标/触摸输入丢弃着色器中的像素。例如:如果我点击精灵的中心,我想要在该精灵的中心出现一圈丢弃的像素,看看精灵背后有丢弃的像素。
谢谢!
P.D:我正在使用cocos2d-js v.3.3
答案 0 :(得分:0)
1.-如何将值数组传递给着色器。
您似乎已经发现了正确的方法系列:glUniform<Type>v
- 如何创建纹理(1D或者如果不可能是2D或3D),并将其作为统一传递
醇>
纹理在行为方面已经是统一的(即,对于整个绘制调用它是恒定的)。为什么不像普通纹理一样访问数据呢?大型统一阵列通常是一个“坏主意”。
3.-我想要的是丢弃精灵的某些像素以查看背后的内容,
使(1)使精灵纹理的透明部分具有0.0 alpha值,并启用混合。如果您使用深度测试,这将无法满足您的需求。
...或(2)编码纹理的alpha通道中的透明度,如果alpha值低于阈值,则在片段着色器中“丢弃”透明片段。