Как очистить свойства материала Opengl ES, чтобы избежать повторного использования неправильных материалов? - PullRequest
0 голосов
/ 19 апреля 2011

Я работаю над Android opengl lib и столкнулся с небольшой проблемой.Я знаю, что это легко исправить, но у меня много проблем с поиском.В скорлупе я работаю над библиотекой графов трехмерных сцен, которая основана на действительно легкой и удивительной библиотеке графических сцен Scenario 2D.Подробное объяснение структуры заняло бы слишком много времени, но по существу каждый узел дерева имеет метод загрузки (GL10 gl), в котором происходит любая инициализация текстуры и / или материала.Затем существуют методы draw () для узлов фигур, а также killDraw () для материалов.

Мои классы материалов предназначены для удобства пользователей для таких людей, как я, которые пришли с точки зрения программы для 3D-моделирования (для меня 3ds max).Вот проблема:

Я создаю несколько 3d фигур в сцене:

FXShape shape4 = new FXShape();
shape4.setShape(new Model("cup.obj"));

Material material = new Material();
material.setAmientAndDiffuse(1,0,0,1);          
shape5.addMaterial(material);

add(shape4);

FXShape shape5 = new FXShape();
shape5.setShape(new Cube());
shape5.addMaterial(new TextureMaterial(shape5.getShape(),R.drawable.crate));
add(shape5);

Все прекрасно работает, за исключением того, что красный материал, который создается для первой фигуры, применяется не только кта, но вторая форма, хотя у нее есть своя текстура.

вот соответствующие методы материала

@Override
public void loadMaterial(GL10 gl) { 
}

@Override
public void draw(GL10 gl){
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT,his.ambientBuffer);
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, this.diffuseBuffer);
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, this.specularBuffer);
    gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, Math.min(shininess, 128));    
}

@Override
public void killDraw(GL10 gl) {
    gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
}

Если я добавлю 10 фигур в сцену и добавлю цветной материал для фигур 1 и 5, то 1-5 - первый материал, и6-10 являются вторыми.

То, что я думал, что должен уметь, это просто вызвать что-то вроде gl.glLoadIdentity () и очистить его, но я не могу найти это для параметров материала.Может ли кто-нибудь помочь?

спасибо

извините за длину, я старался быть как можно более кратким.Если кого-то интересует библиотека или дополнительная информация, я на git hub https://github.com/ghostandthemachine/DroidGraph

1 Ответ

0 голосов
/ 19 апреля 2011

Каждый создаваемый вами объект точно знает, какие свойства материала он использует. Просто запустите / вставьте соответствующее состояние в стек.

...