没加Fragment Shader? 看看你的脚本渲染是怎么写的,不知道你的错误在哪。

解决方案 »

  1.   

    Fragment Shader?是什么?本人菜鸟一只,看不懂请说详细点谢谢!少设置什么请指点一下。 下面是渲染代码
       private float[] lightAmbient = {0.5f, 0.5f, 0.5f, 1.0f};
        private float[] lightDiffuse = {1.0f, 1.0f, 0.0f, 1.0f};
        private float[] specular     = { 0.0f, 0.0f, 0.0f, 1.0f };
        private float[] lightPosition = {0.0f, 0.0f, 0.0f, 1.0f};
    @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            ByteBuffer byteBuf = ByteBuffer.allocateDirect(lightAmbient.length * 4);
            byteBuf.order(ByteOrder.nativeOrder());
            lightAmbientBuffer = byteBuf.asFloatBuffer();
            lightAmbientBuffer.put(lightAmbient);
            lightAmbientBuffer.position(0);        byteBuf = ByteBuffer.allocateDirect(lightDiffuse.length * 4);
            byteBuf.order(ByteOrder.nativeOrder());
            lightDiffuseBuffer = byteBuf.asFloatBuffer();
            lightDiffuseBuffer.put(lightDiffuse);
            lightDiffuseBuffer.position(0);        byteBuf = ByteBuffer.allocateDirect(lightPosition.length * 4);
            byteBuf.order(ByteOrder.nativeOrder());
            lightPositionBuffer = byteBuf.asFloatBuffer();
            lightPositionBuffer.put(lightPosition);
            lightPositionBuffer.position(0);        byteBuf = ByteBuffer.allocateDirect(specular.length * 4);
            byteBuf.order(ByteOrder.nativeOrder());
            specularBuffer = byteBuf.asFloatBuffer();
            specularBuffer.put(specular);
            specularBuffer.position(0);        gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbientBuffer);
            gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuseBuffer);
            gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, specularBuffer);
            //设置灯光位置
            gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPositionBuffer);        gl.glEnable(GL10.GL_LIGHT0);//启用灯光0
            // 着色平滑
            gl.glShadeModel(GL10.GL_SMOOTH);
            // R, G, B, A
            gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
            // 设置深度缓存
            gl.glClearDepthf(1.0f);
            //启用深度测试
            gl.glEnable(GL10.GL_DEPTH_TEST);
            // 深度测试类型
            gl.glDepthFunc(GL10.GL_LEQUAL);
            //剔除背面
            gl.glEnable(GL10.GL_CULL_FACE);
            gl.glCullFace(GL10.GL_BACK);
            // 修正透视
            gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);        // 开启颜色渲染功能.
            gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
            //启用法线
        }
    @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            
            gl.glViewport(0, 0, width, height);
            gl.glMatrixMode(GL10.GL_PROJECTION);
            gl.glLoadIdentity();
            float ratio = (float) width / height;
            gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);// 设置视口的大小
            gl.glMatrixMode(GL10.GL_MODELVIEW);
            gl.glLoadIdentity();
        }
    @Override
        public void onDrawFrame(GL10 gl) {        gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);        gl.glEnable(GL10.GL_LIGHTING);
            gl.glLoadIdentity();
            draw(gl);        gl.glLoadIdentity();
               }
    private void draw(GL10 gl){        gl.glTranslatef(-0.5f, 0.0f, -6.0f);
            gl.glScalef(0.8f, 0.8f, 0.8f);
            gl.glRotatef(45, 1f, 0f, 0f);
            gl.glRotatef(xAngle, 0f, 1f, 0f);
            gl.glColor4f(1.0f,1.0f ,0.0f, 1.0f);        //顶点传给opengl
            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, objvBuffer);
            // 启用顶点数组
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            //启用法线
            gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
            gl.glNormalPointer(GL10.GL_FLOAT, 0, NormalBuffer);  //NormalBuffer换成上面的objvBuffer竟然好多了        gl.glDrawElements(GL10.GL_TRIANGLES ,BufferUtil.objFtxt.length, GL10.GL_UNSIGNED_SHORT, objFBuffer);        gl.glDisableClientState(GL10.GL_NORMAL_ARRAY);
        }