Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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
Android 如何在某些操作后更改现有对象的颜色_Android_Opengl Es - Fatal编程技术网

Android 如何在某些操作后更改现有对象的颜色

Android 如何在某些操作后更改现有对象的颜色,android,opengl-es,Android,Opengl Es,我正在画一个简单的3D形状。该形状从.obj文件中读取,并且整个形状具有一种颜色。 我想创造一种改变颜色的可能性。例如,如果我点击按钮,我想使结构变成红色 我已经阅读了很多教程,但我不知道如何在运行时更改颜色(重画元素?)。我在onDrawFrame gl.glEnableClientState(GL10.GL_COLOR_ARRAY); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, colorBuffe

我正在画一个简单的3D形状。该形状从.obj文件中读取,并且整个形状具有一种颜色。 我想创造一种改变颜色的可能性。例如,如果我点击按钮,我想使结构变成红色

我已经阅读了很多教程,但我不知道如何在运行时更改颜色(重画元素?)。我在
onDrawFrame

gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
            gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, colorBuffer);
            gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
但一切都没有改变

我需要在哪里以及如何实施此类行动

//更新

画法

if(!initialized) {
            init(gl);
            initialized = true;
        }
        if(glCameraMatrixBuffer != null) {
            glMatrixBuffer.put(glMatrix);
            glMatrixBuffer.position(0);

            //argDrawMode3D
            gl.glMatrixMode(GL10.GL_MODELVIEW);
            gl.glLoadIdentity();
            //argDraw3dCamera
            gl.glMatrixMode(GL10.GL_PROJECTION);
            gl.glLoadMatrixf( glCameraMatrixBuffer );

            gl.glMatrixMode(GL10.GL_MODELVIEW);
            gl.glLoadMatrixf(glMatrixBuffer);
        }

gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
        gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, colorBuffer);

        for(int i=0; i<parts.size(); i++){
            TDModelPart t=parts.get(i);
            Material m=t.getMaterial();

            if(m!=null){
                FloatBuffer a=m.getAmbientColorBuffer();
                FloatBuffer d=m.getDiffuseColorBuffer();
                FloatBuffer s=m.getSpecularColorBuffer();
                gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_AMBIENT,a);
                gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_SPECULAR,s);
                gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_DIFFUSE,d);
            }

            gl.glNormalPointer(GL10.GL_FLOAT, 0, t.getNormalBuffer());

            gl.glDrawElements(GL10.GL_TRIANGLES,t.getFacesCount(),GL10.GL_UNSIGNED_SHORT,t.getFaceBuffer());
        }


        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisableClientState(GL10.GL_NORMAL_ARRAY);

public final void onDrawFrame(GL10 gl) {
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        if (DEBUG) {
            gl = (GL10) GLDebugHelper.wrap(gl, GLDebugHelper.CONFIG_CHECK_GL_ERROR, log);
        }
        setupDraw2D(gl);
        gl.glDisable(GL10.GL_DEPTH_TEST);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glDisable(GL10.GL_LIGHTING);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName);
        //load new preview frame as a texture, if needed
        if (frameEnqueued) {
            frameLock.lock();
            if (!isTextureInitialized) {
                initializeTexture(gl);
            } else {
                //just update the image
                //can we just update a portion(non power of two)?...seems to work
                gl.glTexSubImage2D(GL10.GL_TEXTURE_2D, 0, 0, 0, previewFrameWidth, previewFrameHeight,
                        mode, GL10.GL_UNSIGNED_BYTE, frameData);
            }
            frameLock.unlock();
            gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
            gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
            frameEnqueued = false;
        }

        gl.glColor4f(1, 1, 1, 1f);
        //draw camera preview frame:
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, squareBuffer);

        //draw camera square
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

        if (customRenderer != null) {
            customRenderer.setupEnv(gl);
        } else {
//          gl.glEnable(GL10.GL_LIGHTING);
//          gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, ambientLightBuffer);
//          gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, diffuseLightBuffer);
//          gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, specularLightBuffer);
//          gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPositionBuffer);
//          gl.glEnable(GL10.GL_LIGHT0);
        }

        matrixGrabber.getCurrentState(gl);

        if (performAction) {
            Log.d("ZMIANA_KOLORY", "akcja się wola");
            int[] c = new int[]{255, 0, 0};
            Vector<Float> v = markerInfo.getObjects().get(0).vectors;
            ByteBuffer vBuf = ByteBuffer.allocateDirect(v.size() * 4);
            vBuf.order(ByteOrder.nativeOrder());
            float[] newColor = new float[c.length + 1];
            for (int i = 0; i < c.length; i++) {
                newColor[i] = (1.0f / 255) * c[i];
                newColor[3] = 1.0f;
            }

            Log.d("ZMIANA_KOLORY", newColor[0] + " " + newColor[1] + " " + newColor[2] + " " + newColor[3] + " ");

            FloatBuffer colorBuffer = vBuf.asFloatBuffer();
            colorBuffer.put(newColor);
            colorBuffer.position(0);
            gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
            gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, colorBuffer);
            gl.glDisableClientState(GL10.GL_COLOR_ARRAY);

            performAction = false;
//          Log.d("PERFORM_ACTION", "wykonuję akcję: " + actionName);
//          switch (actionName) {
//              case "Highlight":
//
//                  for(ARObject obj : markerInfo.getObjects()) {
////                        if(tmp.get)
//
//                  }
//
//                  actionName = null;
//                  performAction = false;
//                  break;
//          }
        }

        markerInfo.draw(gl);

        if (customRenderer != null) {
            customRenderer.draw(gl);
        }


        if (takeScreenshot) {
            Log.d("SCREENSHOT", "Sprawdzam touched");

            Ray r = new Ray(gl, screenWidth, screenHeight, x, y);
            Log.d("SCREENSHOT", "Near Coord =" + Arrays.toString(r.P0));
            Log.d("SCREENSHOT", "Far Coord =" + Arrays.toString(r.P1));

            takeScreenshot = false;
        }

    }
如果(!已初始化){
初始值(gl);
初始化=真;
}
如果(glCameraMatrixBuffer!=null){
glMatrixBuffer.put(glMatrix);
glMatrixBuffer.位置(0);
//argDrawMode3D
gl.glMatrixMode(GL10.gl_MODELVIEW);
gl.glLoadIdentity();
//argDraw3dCamera
gl.glMatrixMode(GL10.gl_投影);
gl.glLoadMatrixf(glCameraMatrixBuffer);
gl.glMatrixMode(GL10.gl_MODELVIEW);
gl.glLoadMatrixf(glMatrixBuffer);
}
gl.glEnableClientState(GL10.gl\u NORMAL\u数组);
gl.glEnableClientState(GL10.gl_顶点数组);
gl.glEnableClientState(GL10.gl\u颜色\u数组);
gl.glVertexPointer(3,GL10.gl_FLOAT,0,vertexBuffer);
gl.glmaterialsv(GL10.gl\u前和后,GL10.gl\u环境,颜色缓冲);

for(int i=0;iOpenGL是一个基于状态的绘图系统。在调用绘图时未激活/启用的状态无效。要启用颜色数组,请设置指针,然后立即再次禁用它。要考虑颜色顶点数组,必须启用它

然而,你似乎也使用了一种纹理。除此之外,你还使用了固定功能管道(FFP)。纹理、颜色和照明之间存在大量的交互作用,这些都可能导致颜色不显示或不如你所期望的那样


帮你自己一个忙,开始使用着色器。理解FFP的工作方式并不难;但是它增加了太多的状态开关和数据路径,因此使用起来非常麻烦。你可以按照自己的意愿编写40多行代码来设置FFP,也可以编写一行具有相同效果的着色器代码。

我们需要查看更多代码以使其合理suggestions@datenwolf谢谢你提供的信息。老实说,我的示例有点复杂,所以如果你能告诉我什么有助于提出合理的建议,我将提供代码的特定部分。我添加了一些细节,也许这足够了。谢谢你。在本例中,没有使用纹理。我知道你可以在代码中看到,但应用程序从未进入这一部分,我正在处理纯色。当然,我会阅读有关着色器的内容,但你能说一些关于状态的更多信息吗?它需要激活的内容?这是我无法更改颜色的问题吗?