如何将值数组传递为统一以及如何在cocos2djs中创建纹理

时间:2015-04-01 11:34:14

标签: opengl-es cocos2d-js

这些天我一直试图实现着色器功能,但我找不到解决方案。我不确切知道着色器支持的状态,所以我不知道我要问的是否可能:

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

1 个答案:

答案 0 :(得分:0)

  

1.-如何将值数组传递给着色器。

您似乎已经发现了正确的方法系列:glUniform<Type>v

  
      
  1. 如何创建纹理(1D或者如果不可能是2D或3D),并将其作为统一传递
  2.   

纹理在行为方面已经是统一的(即,对于整个绘制调用它是恒定的)。为什么不像普通纹理一样访问数据呢?大型统一阵列通常是一个“坏主意”。

  

3.-我想要的是丢弃精灵的某些像素以查看背后的内容,

使(1)使精灵纹理的透明部分具有0.0 alpha值,并启用混合。如果您使用深度测试,这将无法满足您的需求。

...或(2)编码纹理的alpha通道中的透明度,如果alpha值低于阈值,则在片段着色器中“丢弃”透明片段。