Colors 片段着色器vColor未更改,glUniform4f集合上出现1282错误

Colors 片段着色器vColor未更改,glUniform4f集合上出现1282错误,colors,opengl-es,operation,Colors,Opengl Es,Operation,使用glUniform4f更改片段着色器的vColor时,我面临着色器1282代码问题。我没花多少时间,但毫无头绪。需要帮助的请 我的程序的目标是为三角形使用不同的颜色,但不能使用glUniform应用颜色。更改glUniformam时出现无效操作错误 public class BuildCanvas { private final String vertexShaderCode = "attribute vec4 vPosition;" + "void main()

使用
glUniform4f
更改片段着色器的
vColor
时,我面临着色器1282代码问题。我没花多少时间,但毫无头绪。需要帮助的请

我的程序的目标是为三角形使用不同的颜色,但不能使用
glUniform
应用颜色。更改
glUniform
am时出现无效操作错误

public class BuildCanvas 
{
    private final String vertexShaderCode =
    "attribute vec4 vPosition;" +
    "void main() {" +
    "  gl_Position = vPosition;" +
    "}";

    private final String fragmentShaderCode =
    " precision mediump float; " +
    " uniform vec4 vColor; " +
    " void main() { " +
    "  gl_FragColor = vColor; " +
    " } ";

    int vertexShader;
    int fragmentShader;
    int mProgram;
    FloatBuffer vertexBuffer;
    float[] color;

    static final int COORDS_PER_VERTEX = 2;
    static final int TRIANGLE_VERTEX_CNT =3;

   int initShaders()
   {
    // prepare shaders and OpenGL program
    int vertexShader = MyGLRenderer.loadShader(
    GLES20.GL_VERTEX_SHADER, vertexShaderCode);
    MyGLRenderer.checkGlError("vertexShaderCode");
    int fragmentShader = MyGLRenderer.loadShader(
        GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
        MyGLRenderer.checkGlError("fragmentShaderCode");

    mProgram = GLES20.glCreateProgram();             // create empty OpenGL Program
    MyGLRenderer.checkGlError("glCreateProgram");
    GLES20.glAttachShader(mProgram, vertexShader);   // add the vertex shader to program
    MyGLRenderer.checkGlError("vertexShader");
    GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program
    MyGLRenderer.checkGlError("fragmentShader");
    GLES20.glLinkProgram(mProgram);                  // create OpenGL program executables
    MyGLRenderer.checkGlError("glLinkProgram");
    return 0;
    }


    int fillData(Shape shape)
    {
    int vertexCnt = shape.listPoints.size() *COORDS_PER_VERTEX;
    drawingType eType = shape.eType;


    float[] data ;
    int dataIdx =0;

    data = new float[ COORDS_PER_VERTEX  * shape.listPoints.size()];

    //Log.e("OpenGL", "shape.listPoints.size():" + shape.listPoints.size());
    for(int idx=0;idx<shape.listPoints.size();idx++)
    {
        data[dataIdx++] = shape.listPoints.get(idx).xPos;
        data[dataIdx++] = shape.listPoints.get(idx).yPos;
    }

    // initialize vertex byte buffer for shape coordinates
    ByteBuffer bb = ByteBuffer.allocateDirect(
    // (number of coordinate values * 4 bytes per float)
         dataIdx * 4);
    // use the device hardware's native byte order
    bb.order(ByteOrder.nativeOrder());

    // create a floating point buffer from the ByteBuffer
    vertexBuffer = bb.asFloatBuffer();
    // add the coordinates to the FloatBuffer
    vertexBuffer.put(data, 0, dataIdx);
    // set the buffer to read the first coordinate
    vertexBuffer.position(0);
    return 0;
    }

    int draw()
    {
    int mPositionHandle;
    int mColorHandle;

    // get handle to vertex shader's vPosition member
    mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
    MyGLRenderer.checkGlError("mPositionHandle");

    // Enable a handle to the triangle vertices
    GLES20.glEnableVertexAttribArray(mPositionHandle);

    // get handle to fragment shader's vColor member
    mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");

    MyGLRenderer.checkGlError("mColorHandle");


    // Prepare the triangle coordinate data
    GLES20.glVertexAttribPointer(
          mPositionHandle, COORDS_PER_VERTEX,
          GLES20.GL_FLOAT, false,
          0, vertexBuffer);

    // Set color for drawing the triangle
    // GLES20.glUniform4fv(mColorHandle, 1, color, 0);
    // MyGLRenderer.checkGlError("mColorHandle");

    float rgba[] ={0.0f,1.0f,1.0f,0.0f};
    for(int i=0;i<vertexBuffer.capacity()/(TRIANGLE_VERTEX_CNT*COORDS_PER_VERTEX);i++)
    {
    /********************************************/
    /********************************************/
    /***********On uncommenting following 2 lines am getting shader error 1282 ***********/
    //GLES20.glUniform4f(mColorHandle,rgba[0],rgba[1],rgba[2],rgba[3]);
    //MyGLRenderer.checkGlError("mColorHandle");
    // Draw the triangle
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, i*TRIANGLE_VERTEX_CNT, TRIANGLE_VERTEX_CNT);
    }
    // Disable vertex array
    GLES20.glDisableVertexAttribArray(mPositionHandle);
    //GLES20.glDisableVertexAttribArray(mColorHandle);

    return 0;
    }
}
公共类BuildCanvas
{
私有最终字符串vertexShaderCode=
“属性向量4位置;”+
“void main(){”+
“gl_位置=V位置;”+
"}";
私有最终字符串碎片ShaderCode=
“精密中泵浮动;”+
“统一vec4彩色;”+
“void main(){”+
“gl_FragColor=vColor;”+
" } ";
int顶点着色器;
int片段着色器;
内部程序;
浮动缓冲区顶点缓冲区;
浮动[]颜色;
每个顶点的静态最终整数坐标=2;
静态最终整数三角形\顶点\ CNT=3;
int initShaders()
{
//准备着色器和OpenGL程序
int vertexShader=MyGLRenderer.loadShader(
GLES20.GL_顶点着色器,vertexShaderCode);
MyGLRenderer.checklerror(“vertexShaderCode”);
int fragmentShader=MyGLRenderer.loadShader(
GLES20.GL_FRAGMENT_着色器,fragmentShaderCode);
checkleror(“fragmentShaderCode”);
mProgram=GLES20.glCreateProgram();//创建空的OpenGL程序
MyGLRenderer.checklerror(“glCreateProgram”);
GLES20.glAttachShader(mProgram,vertexShader);//将顶点着色器添加到程序中
MyGLRenderer.checklerror(“顶点着色器”);
GLES20.glAttachShader(mProgram,fragmentShader);//将片段着色器添加到程序中
checklerror(“fragmentShader”);
GLES20.glLinkProgram(mProgram);//创建OpenGL程序可执行文件
MyGLRenderer.checklerror(“glLinkProgram”);
返回0;
}
int fillData(形状)
{
int vertexCnt=shape.listPoints.size()*每个顶点的坐标;
drawingType eType=shape.eType;
浮动[]数据;
int dataIdx=0;
数据=新浮点[COORDS_PER_VERTEX*shape.listPoints.size()];
//Log.e(“OpenGL”、“shape.listPoints.size():”+shape.listPoints.size());

对于(int idx=0;idxy您错过了将程序对象安装为当前呈现状态的一部分()。添加
GLES20.glUseProgram(mProgram);
GLES20.glLinkProgram(mProgram);
之后和
GLES20.glUniform4vf(…)
之前。谢谢您rabbi76…在这一行更改之后…一切看起来都很好。向您致敬