Creating a Gradient Color in Fragment Shader

前端 未结 2 1059
眼角桃花
眼角桃花 2021-01-02 21:55

I\'m trying to achieve making a gradient color as the design apps (Photoshop for example) does, but can\'t get the exact result i want.

My shader creates very nice \

2条回答
  •  萌比男神i
    2021-01-02 22:27

    Ther is a simple mistake when you set up the color value. You used 1.9 for the value of red color channel instead of 1.0, when you set up the orange color.

    Change your code to:

    vec3 color1 = vec3(1.0, 0.55, 0.0); // 1.0 insted of 1.9
    

    Note, the final color channels are clamped to [0, 1], but since you use mix to interpolate the colors, a color channel above 1.0 raises the part of the color in the gradient.


    Preview:


    var ShaderProgram = {};
      ShaderProgram.Create = function( shaderList ) {
          var shaderObjs = [];
          for ( var i_sh = 0; i_sh < shaderList.length; ++ i_sh ) {
              var shderObj = this.CompileShader( shaderList[i_sh].source, shaderList[i_sh].stage );
              if ( shderObj == 0 )
                  return 0;
              shaderObjs.push( shderObj );
          }
          var progObj = this.LinkProgram( shaderObjs )
          if ( progObj != 0 ) {
              progObj.attribIndex = {};
              var noOfAttributes = gl.getProgramParameter( progObj, gl.ACTIVE_ATTRIBUTES );
              for ( var i_n = 0; i_n < noOfAttributes; ++ i_n ) {
                  var name = gl.getActiveAttrib( progObj, i_n ).name;
                  progObj.attribIndex[name] = gl.getAttribLocation( progObj, name );
              }
              progObj.unifomLocation = {};
              var noOfUniforms = gl.getProgramParameter( progObj, gl.ACTIVE_UNIFORMS );
              for ( var i_n = 0; i_n < noOfUniforms; ++ i_n ) {
                  var name = gl.getActiveUniform( progObj, i_n ).name;
                  progObj.unifomLocation[name] = gl.getUniformLocation( progObj, name );
              }
          }
          return progObj;
      }
      ShaderProgram.AttributeIndex = function( progObj, name ) { return progObj.attribIndex[name]; } 
      ShaderProgram.UniformLocation = function( progObj, name ) { return progObj.unifomLocation[name]; } 
      ShaderProgram.Use = function( progObj ) { gl.useProgram( progObj ); } 
      ShaderProgram.SetUniformF2  = function( progObj, name, arr ) { if(progObj.unifomLocation[name]) gl.uniform2fv( progObj.unifomLocation[name], arr ); }
      ShaderProgram.CompileShader = function( source, shaderStage ) {
          var shaderScript = document.getElementById(source);
          if (shaderScript) {
            source = "";
            var node = shaderScript.firstChild;
            while (node) {
              if (node.nodeType == 3) source += node.textContent;
              node = node.nextSibling;
            }
          }
          var shaderObj = gl.createShader( shaderStage );
          gl.shaderSource( shaderObj, source );
          gl.compileShader( shaderObj );
          var status = gl.getShaderParameter( shaderObj, gl.COMPILE_STATUS );
          if ( !status ) alert(gl.getShaderInfoLog(shaderObj));
          return status ? shaderObj : 0;
      } 
      ShaderProgram.LinkProgram = function( shaderObjs ) {
          var prog = gl.createProgram();
          for ( var i_sh = 0; i_sh < shaderObjs.length; ++ i_sh )
              gl.attachShader( prog, shaderObjs[i_sh] );
          gl.linkProgram( prog );
          status = gl.getProgramParameter( prog, gl.LINK_STATUS );
          if ( !status ) alert("Could not initialise shaders");
          gl.useProgram( null );
          return status ? prog : 0;
      }
              
      function drawScene(){
      
          var canvas = document.getElementById( "ogl-canvas" );
          var vp = [canvas.width, canvas.height];
          
          gl.viewport( 0, 0, canvas.width, canvas.height );
          gl.enable( gl.DEPTH_TEST );
          gl.clearColor( 0.0, 0.0, 0.0, 1.0 );
          gl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT );
          ShaderProgram.Use( progDraw );
          ShaderProgram.SetUniformF2( progDraw, "u_resolution", vp )
          gl.enableVertexAttribArray( progDraw.inPos );
          gl.bindBuffer( gl.ARRAY_BUFFER, bufObj.pos );
          gl.vertexAttribPointer( progDraw.inPos, 2, gl.FLOAT, false, 0, 0 ); 
          gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, bufObj.inx );
          gl.drawElements( gl.TRIANGLES, bufObj.inx.len, gl.UNSIGNED_SHORT, 0 );
          gl.disableVertexAttribArray( progDraw.pos );
      }  
      
      var gl;
      var prog;
      var bufObj = {};
      function sceneStart() {
      
          var canvas = document.getElementById( "ogl-canvas");
          gl = canvas.getContext( "experimental-webgl", { premultipliedAlpha: true } );
          if ( !gl )
            return;
      
          progDraw = ShaderProgram.Create( 
            [ { source : "draw-shader-vs", stage : gl.VERTEX_SHADER },
              { source : "draw-shader-fs", stage : gl.FRAGMENT_SHADER }
            ] );
          progDraw.inPos = gl.getAttribLocation( progDraw, "inPos" );
          if ( prog == 0 )
              return;
      
          var pos = [ -1, -1, 1, -1, 1, 1, -1, 1 ];
          var inx = [ 0, 1, 2, 0, 2, 3 ];
          bufObj.pos = gl.createBuffer();
          gl.bindBuffer( gl.ARRAY_BUFFER, bufObj.pos );
          gl.bufferData( gl.ARRAY_BUFFER, new Float32Array( pos ), gl.STATIC_DRAW );
          bufObj.inx = gl.createBuffer();
          bufObj.inx.len = inx.length;
          gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, bufObj.inx );
          gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, new Uint16Array( inx ), gl.STATIC_DRAW );
      
          setInterval(drawScene, 50);
      }
    
      
      
    
    
          
     

提交回复
热议问题