Pergunta

Ahoy!

Tenho procurado atualizar alguns códigos de teste antigos em uma tentativa de aprimorar os novos recursos adicionados ao GLKit. Até agora, consegui configurar um GLKViewController e começar a renderizar algumas formas básicas, mas tenho lutado para encontrar qualquer informação decente sobre GLKBaseEffect.

A documentação do GLKBaseEffect afirma:

No momento da inicialização, seu aplicativo primeiro cria um contexto OpenGL ES 2.0 e o torna atual. Em seguida, ele aloca e inicializa um novo objeto de efeito, configura suas propriedades e chama seu método prepareToDraw. Vincular um efeito faz com que um sombreador seja compilado e vinculado ao contexto atual do OpenGL ES. O efeito de base também requer que os dados do vértice sejam fornecidos pelo seu aplicativo. Para fornecer dados de vértice, crie um ou mais objetos de matriz de vértices. Para cada atributo exigido pelo sombreador, o objeto de matriz de vértice deve habilitar o atributo e apontar para os dados armazenados em um objeto de buffer de vértice.

O que estou lutando para discernir é;

Eu preciso de um objeto GLKBaseEffect para cada "modelo" que estou renderizando? Ou devo usar um único GLKBaseEffect para cada "cena" e simplesmente alterar as propriedades imediatamente antes de chamar prepareToDraw?

Eu vi alguns tutoriais para motores de jogo e renderizadores que simplesmente usam um único GLKBaseEffect para cada modelo, mas isso parece totalmente ineficiente se o mesmo pudesse ser alcançado com uma única instância.

Pela leitura da documentação, quase parece que essa é a melhor abordagem, mas considerando que vi tantas pessoas usando várias instâncias, estou começando a pensar que esse não é o caso.

Alguém pode lançar alguma luz sobre isso? GLKit ainda é bastante novo para iOS (e para mim), então qualquer informação seria muito apreciada.

Foi útil?

Solução

Não, você não deve criar um GLKBaseEffect exclusivo para cada objeto.Por exemplo, se você está desenhando um labirinto, cada tijolo nesse labirinto pode ser seu próprio objeto, mas todos podem compartilhar o mesmo GLKBaseEffect.Lembre-se, porém, que GLKBaseEffect também armazena informações no local, bem como textura, iluminação, neblina, etc. Então, se você quiser desenhar os tijolos em mais de um lugar (o que eu suponho que você faça :-) você ajusta sua matriz de transformação e então chamaa API 'prepareToDraw'.

Concordo que precisamos de mais tutoriais escritos por pessoas que usaram o GLKBaseEffect extensivamente para obter mais informações sobre as práticas recomendadas para esta nova estrutura.

Boa navegação.

Outras dicas

Cada alteração das propriedades "fundamentais" (lightingType, lightModelTwoSided, colorMaterialEnabled, ...) fará com que um novo programa de sombreador seja carregado com a próxima chamada "prepareToDraw".

Então, se você não usar uma ordem de renderização, não importa muito se você usa um efeito para cada objeto renderizado ou um único efeito de mudança para todos os objetos.Em ambos os casos, você terminará com uma chamada desnecessária de glUseProgram e muitas mudanças de estado OpenGL desnecessárias para cada objeto desenhado.(use o modelo de instrumentos "Análise OpenGL ES" para investigar as chamadas OpenGL geradas)

Dito isso, sua preocupação principal deve ser ordenar seus objetos para renderização.Agrupe pelo menos todos os objetos que usam o mesmo programa de sombreador.Em seguida, crie e use um objeto GLKBaseEffect para cada um desses grupos. Se você não tiver certeza se uma alteração na propriedade GLKBaseEffect fará com que um novo programa de sombreador seja carregado, eu recomendo usar Instruments para investigar as chamadas OpenGL.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top