Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在WebGL中编辑纹理的RGBA值?_Javascript_Opengl Es_Webgl - Fatal编程技术网

Javascript 如何在WebGL中编辑纹理的RGBA值?

Javascript 如何在WebGL中编辑纹理的RGBA值?,javascript,opengl-es,webgl,Javascript,Opengl Es,Webgl,我有一个片段着色器,如下所示: <script id="shader-fs" type="x-shader/x-fragment"> precision mediump float; uniform sampler2D uSampler; varying vec2 vTextureCoord; void main() { gl_FragColor = texture2D(uSampler, vTextureCoord).rgba;

我有一个片段着色器,如下所示:

<script id="shader-fs" type="x-shader/x-fragment">
    precision mediump float;
    uniform sampler2D uSampler;
    varying vec2 vTextureCoord;
    void main() {
        gl_FragColor = texture2D(uSampler, vTextureCoord).rgba;
    }
</script>
source参数只是图像的url,example.png可以是一个源。我正在尝试将纹理的颜色更改为不同的颜色。是否可以将纹理中的每个像素重新指定为特定颜色?也可以给纹理着色吗?我是否可以在initTexture函数中添加另一个名为color的参数,并将其设置为一个包含4个值RGBA的数组,或者如果无法编辑alpha通道,则使用3个值,然后以某种方式使用该数组将纹理的颜色更改为一种纯色或着色


objectTextures只是一个数组,它保存创建的所有WebGLTextures。

我最近发现了一些可能非常适合您尝试实现的功能。您可能知道如何创建顶点缓冲区,就像您已经为顶点位置和纹理坐标所做的那样。为着色器中的颜色添加其他颜色

添加到顶点着色器,但它看起来像:

attribute vec4 aColors; 
varying vec4 vColors; 

void main ( void ) { 
    vColors = aColors; //basically the same as you do with texture coordinates
}
您的片段着色器现在如下所示:

precision mediump float;

uniform sampler2D uSampler;

varying vec4 vColor;
varying vec2 vTextureCoord;
void main() {
    gl_FragColor = texture2D(uSampler, vTextureCoord) * vColor;
}
好的,这就是基本逐顶点颜色的设置方式。但现在出现了一个稍微不寻常的部分:不像通常那样设置缓冲区并为每个顶点填充颜色,您只需为所有顶点将其设置为常量值,基本上是在该位置未启用VertexAttributeArray时使用的默认值

var colorLocation = gl.getAttribLocation( yourProgram, "aColors" );
var yourColor = [1,0,1,1];
gl.vertexAttrib4fv( colorLocation, yourColor );

通过这种方式,您可以使用恒定颜色或每个顶点的不同颜色进行着色。这不是实现着色的唯一方法,有无数种选择,但我觉得这样做既优雅又灵活:

仅用于测试,我将您的颜色和颜色位置设置为全局变量。指定了colorLocation,如initShader部分所示,程序在该部分执行其他getAttributeLocation和getUniformLocation,将程序更改为更正一个,并在drawScene函数中设置VertexAttribute4vColorLocation,即您的颜色。我得到“WebGL:INVALID_VALUE:vertexAttrib4fv:index超出范围”。我做错了什么?没关系,我将colorLocation设置为属性'aColors'而不是'aColor',它就工作了!非常感谢。“很高兴我能帮助你,”Mythenatical说
var colorLocation = gl.getAttribLocation( yourProgram, "aColors" );
var yourColor = [1,0,1,1];
gl.vertexAttrib4fv( colorLocation, yourColor );