Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.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
OPENGLES 20``GlUniform4fv``方法,用于在C#Android中为引发异常的对象着色_C#_Android_Opengl Es 2.0 - Fatal编程技术网

OPENGLES 20``GlUniform4fv``方法,用于在C#Android中为引发异常的对象着色

OPENGLES 20``GlUniform4fv``方法,用于在C#Android中为引发异常的对象着色,c#,android,opengl-es-2.0,C#,Android,Opengl Es 2.0,我试图用C#在Android Xamarin中绘制一个三角形。三角形是一个使用draw方法的类。在这个绘制方法中,有一个openGL20方法可以为我们刚刚创建的三角形对象着色。每当draw方法中的执行到达此颜色对象方法时,就会抛出此异常Java.Lang.IllegalArgumentException Message=length-offset

我试图用C#在Android Xamarin中绘制一个三角形。三角形是一个使用draw方法的类。在这个绘制方法中,有一个openGL20方法可以为我们刚刚创建的三角形对象着色。每当
draw
方法中的执行到达此颜色对象方法时,就会抛出此异常
Java.Lang.IllegalArgumentException Message=length-offset
。 我真的不明白这个错误意味着什么,但这里是我目前使用的代码

 public class MyGLRenderer : Java.Lang.Object, GLSurfaceView.IRenderer
    {
     //Renderer method to draw the triangle object
       public void OnDrawFrame(IGL10 gl)
        {
            GLES20.GlClear(GLES20.GlColorBufferBit);
            Triangle triangle = new Triangle();
            triangle.draw();
        }
       //Method to set the view and the height of the painting window
          public void OnSurfaceChanged(IGL10 gl, int width, int height)
        {
            GLES20.GlViewport(0, 0, width, height);
        }
         public void OnSurfaceCreated(IGL10 gl, Javax.Microedition.Khronos.Egl.EGLConfig config)
        {
            //Set the background frame color
            GLES20.GlClearColor(0.0f, 0.0f, 1.0f, 0.0f);
            GLES20.GlDrawArrays(GLES20.GlColorBufferBit, 2, 10);
         }
    }

下面的代码定义了Triangle类和引发异常的OPENGL20 color方法

 public class Triangle
    {
        private FloatBuffer vertexBuffer;

        //Number of co-ordinates per vertex in this context
        private static readonly int Coords_per_vert = 3;

        private static float[] triangleCoords = new float[] {
            0.0f,0.622008459f,0.0f, //top
            -0.5f,-0.311004243f,0f  , //bottom left
            0.5f, -0.311004243f,0.0f   //bottom right
        };

        //Set color with red, green, blue and alpha values
        private float[] color = new float[] { 0.63671875f, 0.76953125f, 0.22265625f };

        private readonly int mProgram;

        public Triangle()
        {
            //Initialize vertex byte buffer for shape co-ordinates
            ByteBuffer bb = ByteBuffer.AllocateDirect(triangleCoords.Length * 4);
            //Use the device native byte order
            bb.Order(ByteOrder.NativeOrder());
            FloatBuffer myfloat = bb.AsFloatBuffer();
            //Create floating point buffer from ByteBuffer
            vertexBuffer = bb.AsFloatBuffer();
            vertexBuffer.Put(triangleCoords);
            vertexBuffer.Position(0);

            int vertexShader = MyGLRenderer.loadShader(GLES20.GlVertexShader, vertexShaderCode);
            int fragmentShader = MyGLRenderer.loadShader(GLES20.GlFragmentShader, fragmentShaderCode);
            //Create empty opengles program
            mProgram = GLES20.GlCreateProgram();
            //Add vertex shader to program
            GLES20.GlAttachShader(mProgram, vertexShader);
            //Add Fragment to shader
            GLES20.GlAttachShader(mProgram, fragmentShader);
            //Create openGL program executables
            GLES20.GlLinkProgram(mProgram);
        }

        private readonly string vertexShaderCode = "attribute vec4 vPosition;" +
                                                                                            "void main(){" +
                                                                                            "  gl_Position=vPosition;" +
                                                                                             "}";

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

        private int positionHandle, colorHandle;
        private readonly int vertexCount = triangleCoords.Length / Coords_per_vert;
        private readonly int vertexStride = Coords_per_vert * 4;

        //Create a method for drawing the triangle
        public void draw()
        {
            //Add Program to open GLES Environment
            GLES20.GlUseProgram(mProgram);
            //Get handle to vertex shader's vPosition member
            positionHandle = GLES20.GlGetAttribLocation(mProgram, "vPosition");
            //Enable a handle to the triangle's vertices
            GLES20.GlEnableVertexAttribArray(positionHandle);
            //Prepare the triangle co ordinate data
            GLES20.GlVertexAttribPointer(positionHandle, Coords_per_vert, GLES20.GlFloat, false, vertexStride, vertexBuffer);
            //Get handle to fragment shader's vColor Member
            colorHandle = GLES20.GlGetUniformLocation(mProgram, "vColor");
            //Set color for drawing the triangle
            GLES20.GlUniform4fv(colorHandle, 1, color, 3);
            
            //Draw the triangle, this method causes an exception
            GLES20.GlDrawArrays(GLES20.GlTriangles, 0, vertexCount);
            //Disable vertex array
            GLES20.GlDisableVertexAttribArray(positionHandle);
        }
    }

请帮助我成功地为三角形对象上色,我做错了什么

您正在为vec4制服使用一个3大小的浮点数组。 将alpha数组添加到颜色数组中,如下所示 替换

第二个数组的最后一个成员表示所绘制颜色的alpha或不透明度

  private float[] color = new float[] { 0.63671875f, 0.76953125f, 0.22265625f };
  private float[] color = new float[] { 0.63671875f, 0.76953125f, 0.22265625f,1.0f};