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

Opengl es 如何将值数组作为统一传递,以及如何在cocos2djs中创建纹理,opengl-es,cocos2d-js,Opengl Es,Cocos2d Js,这几天我一直在尝试实现着色器功能,但我没有找到解决方案。我不知道着色器支持的确切状态,因此我不知道我要问的是否可能: 1.-如何将值数组传递给着色器 我发现有些函数是为web编写的,但不是为native编写的。例如: 使用2Fv设置UniformLocation 这可能是我想要的,但在native中没有定义。有没有办法将浮点数组传递给着色器? 统一的目标是这样的:统一的向量2位置[30] 2.-替代1。传递带有个性化值的纹理也很好 所以现在我的问题是如何创建一个纹理(1D,或者如果这不可能是2D

这几天我一直在尝试实现着色器功能,但我没有找到解决方案。我不知道着色器支持的确切状态,因此我不知道我要问的是否可能:

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

我发现有些函数是为web编写的,但不是为native编写的。例如:

使用2Fv设置UniformLocation

这可能是我想要的,但在native中没有定义。有没有办法将浮点数组传递给着色器? 统一的目标是这样的:统一的向量2位置[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);
var texture=this.my_texture=gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D,纹理);
var像素=新的Uint8Array(4096);
对于(var i=0;i
1.-如何将值数组传递给着色器

您似乎已经找到了正确的方法系列:
glUniformv

  • 如何创建纹理(1D或2D或3D不可能的情况下),并将其作为均匀传递
  • 纹理在行为上已经是一致的(即,它在整个绘制调用中是恒定的)。为什么不像普通纹理一样访问数据呢?大的一致数组通常是一个“坏主意”

    -我想要的是丢弃精灵的某些像素,看看后面是什么

    或者(1)使精灵纹理的透明部分具有0.0 alpha值,并启用混合。如果使用深度测试,这不会达到您想要的效果


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

    我编辑了我想要的内容,因为我解释得不太清楚。-1)是的,但它不是为本机代码实现的,即使在3.5中也没有功能-2) 你是对的,我考虑过了。所以这个调用有点像glUniformTexture,但我不知道如何创建个性化的纹理值来传递它。例如,我可以用0或1创建一个400x400的纹理,我按下了精灵,希望它的像素被丢弃。>因此调用类似于glUniformTexture。不只需使用普通纹理。使用制服的困扰是什么?>但我不知道的是如何创建个性化值的纹理来传递它。与上传普通纹理的方式完全相同。我需要根据输入更改该纹理的值。因此,如果我的纹理遮罩是一个400x400的1值。如果单击纹理的中心,则200x200周围的像素(也取决于半径)将传递为0。然后每次我更改它时,我都需要将它传递给着色器,并知道如何进行更改。基本上是因为有了这个遮罩,我将能够丢弃目标精灵的像素。但是,如果有一种方法可以在不通过着色器的情况下更改此目标精灵的alpha,那么这也是一个受欢迎的解决方案。这确实是一个棘手的问题!我已经找到了一些样本(搜索Web上的“COCOS2D可破坏地形”),用于目标C和C++,但没有JS。这似乎是因为cocos2djs中缺少“可变纹理”类,所以我不完全确定我们是否可以每像素修改一个纹理像素。