Pergunta

Estou recebendo um erro de peixe quando usando glDrawElements (). Eu estou tentando processar primitivas simples (principalmente retângulos) para acelerar o desenho de texto e assim por diante, mas quando eu chamo glDrawElements () toda a tela pisca preto (e não apenas minha área janela) para um quadro mais ou menos. O próximo quadro que se volta para as mesmas "cores do Windows" como antes. E assim treme por um par de segundos, terminando em uma caixa de mensagem dizendo

The NVIDIA OpenGL Driver encountered an unrecoverable error
and must close this application.

Error 12

Existe alguma definição para GL que eu preciso redefinir antes de chamar glDrawElements ()? Eu sei que não é pouco pendurado glEnableClientState (), eu verifiquei (Eu costumava ter um desses, mas, em seguida, glDrawElements () caiu em seu lugar).

Venha para pensar sobre isso, ele quase se parece com algum erro de buffer de volta ... Todas as ideias sobre o que tentar?

Foi útil?

Solução

Obviamente você está misturando modo VBO e modo de VA. Isso é perfeitamente possível, mas deve ser usado com cuidado.

Quando você chama:

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

Isto significa que na próxima vez que você tornar algo com glDrawElements(..., ..., ..., x), ele irá usar x como um ponteiro sobre os dados índices, e a última chamada para pontos glVertexPointer nos dados vértices.

Se você não unbind a corrente VBO e IBO (com o acima exposto duas chamadas glBindBuffer), isso significa que quando o processamento com os mesmos glDrawElements, x vai ser usado como um deslocamento nos índices dados no IBO , e a última chamada para glVertexPointer como uma compensação nos dados vértices no VBO .

Dependendo valores de x e glVertexPointer você pode fazer o acidente motorista porque os offsets sair dos limites e / ou os dados subjacentes são do tipo errado (NaN).

Assim, para responder sua pergunta, depois de desenhar com o modo VBO e, em seguida, desenhar com o modo VA:

  1. desvincular o VBO atual
  2. desvincular o IBO atual
  3. especificar o endereço vértices certas com glVertexPointer
  4. especificar o endereço índices certas com glDrawElements

e, em seguida, ele vai ficar bem.

Outras dicas

Bah! Encontrei. Quando eu fiz

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

antes de renderizar a cintilação + quebrando parou. Este é o comportamento esperado? Desculpe por desperdiçar tempo e espaço.

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