Android 如何在某些操作后更改现有对象的颜色
我正在画一个简单的3D形状。该形状从.obj文件中读取,并且整个形状具有一种颜色。 我想创造一种改变颜色的可能性。例如,如果我点击按钮,我想使结构变成红色 我已经阅读了很多教程,但我不知道如何在运行时更改颜色(重画元素?)。我在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
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谢谢你提供的信息。老实说,我的示例有点复杂,所以如果你能告诉我什么有助于提出合理的建议,我将提供代码的特定部分。我添加了一些细节,也许这足够了。谢谢你。在本例中,没有使用纹理。我知道你可以在代码中看到,但应用程序从未进入这一部分,我正在处理纯色。当然,我会阅读有关着色器的内容,但你能说一些关于状态的更多信息吗?它需要激活的内容?这是我无法更改颜色的问题吗?