Domanda

ho questo gioco non-così-piccolo-più tile-based, che è il mio primo vero progetto OpenGL. Voglio rendere ogni piastrella come un oggetto 3D. Così in un primo momento ho creato alcuni oggetti, come un cubo e una sfera, ha fornito loro normali ai vertici e li rese in modalità immediato con ombreggiatura piatta. Ma dal momento che ho come 10.000 oggetti per livello, è stato un po 'lento. Così ho messo i miei vertici e normali in VBOs.

È lì che ho incontrato il primo problema: Prima di utilizzare VBOs Ho appena push()ed e matrici pop()ed per ogni oggetto e glTranslate usato / glRotate di metterli in mia scena. Ma quando ho fatto la stessa cosa con VBOs, l'illuminazione ha iniziato a comportarsi in modo strano. Invece di una posizione di illuminazione fissa dietro la macchina fotografica, la luce sembrava ruotare con i miei oggetti. Quando si muove intorno a loro di 180 gradi ho potuto vedere solo un'ombra.

Così ho fatto qualche ricerca. Non sono riuscito a trovare una risposta al mio problema specifico, ma ho letto, che invece di utilizzare glTranslate / glRotate si dovrebbe implementare shader e fornire loro matrici uniformi.

ho pensato "forse che potrebbe risolvere il mio problema troppo" e implementato un primo programma shader di piccola vertici che solo allungato miei oggetti un po ', giusto per vedere se potessi ottenere uno shader al lavoro prima di concentrarsi sui dettagli.

void main(void)
{
    vec4 v = gl_Vertex;
    v.x = v.x * 0.5;
    v.y = v.y * 0.5;
    gl_Position = gl_ModelViewProjectionMatrix * v;
}

Beh, i miei oggetti di ottenere allungato - ma ora OpenGLs flat shading è rotto. Ho appena ottenere sfumature bianche. E non riesco a trovare alcuna informazione utile. Così ho preso un paio di domande:

  • È possibile utilizzare un solo dello shader in un momento, e quando si usa il mio shader OpenGLs flat shading è spento? Quindi devo implementare flat shading me stesso?

  • E i miei normali vettore? Ho letto da qualche parte, che ci sia qualcosa come una normale matrice. Forse devo applicare operazioni ai miei normali e quando si modificano i vertici?

È stato utile?

Soluzione

Che l'illuminazione viene incasinato con le operazioni di matrice cambia mezzi, che le chiamate a glLightfv(..., GL_POSITION, ...) avvengono nel contesto sbagliato (non il contesto OpenGL, ma lo stato delle matrici, ecc.).

Beh, i miei oggetti di ottenere allungato - ma ora OpenGLs flat shading è rotto. Ho appena ottenere sfumature bianche

Credo che si intende Gourad ombreggiatura (piane mezzi di ombreggiamento qualcosa di diverso). La cosa è: se si sta utilizzando un vertex shader si deve fare everthing la pipeline funzione fissa ha fatto. Che include il calcolo illuminotecnico. Lighthouse3D ha un bel tutorial http://www.lighthouse3d.com/tutorials/glsl-tutorial / illuminazione / come fa Nicol Bolas' http://arcsynthesis.org/gltut/Illumination /Illumination.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top