2015-10-10 10 views
11

Ho un'applicazione OpenGL (4.1) Costruisco in Xcode che ha funzionato benissimo prima dell'aggiornamento, ma ora scrive nulla alla vista OpenGL. L'applicazione si costruisce senza errori o avvisi e gli shader GLSL compilano e collegano senza errori.GLSL Texture Sampler non funzionare dopo l'aggiornamento a OS 10.11, Xcode 7.0.1

Ho eseguito alcuni test per vedere se gli shaders sono fondamentalmente lavorando:

Se l'ultima riga dello shader frammento è:

fragColor = vec4(1.0, 0.0, 0.0, 1.0); 

La finestra OpenGL è completamente rossa, in quanto dovrebbe essere. Penso che questo confermi anche che i dati dei vertici vengono trasmessi correttamente. Posso animare la vista per ruotare su qualsiasi asse, e di nuovo posso vedere che i dati del vertice (comprese le profondità) vengono passati correttamente.

Se l'ultima riga shader frammento è o:

fragColor = vec4(texCoord[0], 0.0, 0.0, 1.0); 

o

fragColor = vec4(texCoord[1], 0.0, 0.0, 1.0); 

ottengo un gradiente rosso sia nella direzione X o Y, indicando che quel che coordinate texture vengono anche passati correttamente.

così sto pensando che i dati trama in sé non viene passato al campionatore per qualche motivo. Ecco il codice pertinente.

Il codice che crea la trama è:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

glGenTextures(1, appController->appDelegate->wispTexture); 
glBindTexture(GL_TEXTURE_2D, appController->appDelegate->wispTexture[0]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)TEXTUREWIDTH, (GLsizei)TEXTUREHEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, appController->appDelegate->wispTexture[0]); 

L'origine dati per la chiamata glTexImage2D è nullo per ora, perché io carico in seguito nell'applicazione. L'applicazione crea i dati di immagine di texture, ma per ora solo per testare il funzionamento dei shaders sto caricarlo al bianco solido con:

for(int i = 0; i < NUMTEXTUREPOINTS; i++) 
{ 
    appController->textureManager->wispBitmapData[i].red = 255; 
    appController->textureManager->wispBitmapData[i].green = 255; 
    appController->textureManager->wispBitmapData[i].blue = 255; 
    appController->textureManager->wispBitmapData[i].alpha = 255; 
} 

in cui è dichiarato wispBitmapData come:

AlphaPixelBytes wispBitmapData[NUMTEXTUREPOINTS]; 

e AlphaPixelBytes è definito come una struttura:

typedef struct 
{ 
    unsigned char red; 
    unsigned char green; 
    unsigned char blue; 
    unsigned char alpha; 
} AlphaPixelBytes; 

il codice per disegnare l'immagine è:

glBindTexture(GL_TEXTURE_2D, appDelegate->wispTexture[0]); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, (GLsizei)TEXTUREWIDTH, (GLsizei)TEXTUREHEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, appController->textureManager->wispBitmapData); 

glBindBuffer(GL_ARRAY_BUFFER, appDelegate->wispVertexBuffer[0]); 
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(wispVertices), wispVertices); 

glBindBuffer(GL_ARRAY_BUFFER, appDelegate->wispTexCoordBuffer[0]); 
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(wispTextureCoordinates), wispTextureCoordinates); 

glBindBuffer(GL_ARRAY_BUFFER, appDelegate->wispHitsBuffer[0]); 
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(wispScreenHits), wispScreenHits); 

glBindBuffer(GL_ARRAY_BUFFER, appDelegate->wispNormalBuffer[0]); 
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(wispNormals), wispNormals); 

glUseProgram(appDelegate->wispShaders); 

glBindBuffer(GL_ARRAY_BUFFER, appDelegate->wispVertexBuffer[0]); 
glVertexAttribPointer(appDelegate->wispPositionLoc, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 
glEnableVertexAttribArray(appDelegate->wispPositionLoc); 

glBindBuffer(GL_ARRAY_BUFFER, appDelegate->wispTexCoordBuffer[0]); 
glVertexAttribPointer(appDelegate->wispTexCoordLoc, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 
glEnableVertexAttribArray(appDelegate->wispTexCoordLoc); 

glBindBuffer(GL_ARRAY_BUFFER, appDelegate->wispHitsBuffer[0]); 
glVertexAttribPointer(appDelegate->wispHitsLoc, 1, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 
glEnableVertexAttribArray(appDelegate->wispHitsLoc); 

glBindBuffer(GL_ARRAY_BUFFER, appDelegate->wispNormalBuffer[0]); 
glVertexAttribPointer(appDelegate->wispNormalLoc, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 
glEnableVertexAttribArray(appDelegate->wispNormalLoc); 

glUniform1i(appDelegate->wispFilterModeLoc, coloringdata->filteringMode); 
glUniform1i(appDelegate->wispMaxHitsLoc, maxScreenHits); 
glUniform1i(appDelegate->wispMaxNumSamplesLoc, coloringdata->maxNumSamples); 
glUniform1f(appDelegate->wispSampleSizeFactorLoc, coloringdata->sampleSizeFactor); 
glUniform1i(appDelegate->wispDisplayModeLoc, coloringdata->displayMode); 
glUniform1i(appDelegate->wispLightOnLocation, coloringdata->lightingOn); 

glUniformMatrix4fv(appDelegate->wispModelMatrixLocation, 1, GL_FALSE, appDelegate->modelMatrix.m); 
glUniformMatrix4fv(appDelegate->wispViewMatrixLocation, 1, GL_FALSE, appDelegate->viewMatrix.m); 
glUniformMatrix4fv(appDelegate->wispProjectionMatrixLocation, 1, GL_FALSE, appDelegate->projectionMatrix.m); 
glUniformMatrix3fv(appDelegate->wispNormalMatrixLocation, 1, GL_FALSE, appDelegate->normalMatrix.m); 
glUniform3fv(appDelegate->wispLightPositionLocation, 1, coloringdata->lightPosition); 

glActiveTexture(GL_TEXTURE0); 
glUniform1i(appDelegate->wispTextureLoc, 0); 
glBindTexture(GL_TEXTURE_2D, appDelegate->wispTexture[0]); 

// *********************************** Draw the Image to The Screen 

glBindVertexArray(appDelegate->wispVertexArray[0]); 
glBindVertexArray(appDelegate->wispTexCoordArray[0]); 
glBindVertexArray(appDelegate->wispHitsArray[0]); 
glBindVertexArray(appDelegate->wispNormalArray[0]); 

glDrawArrays(GL_POINTS, 0, NUMSCREENPOINTS); 

glDisableVertexAttribArray(appDelegate->wispPositionLoc); 
glDisableVertexAttribArray(appDelegate->wispTexCoordLoc); 
glDisableVertexAttribArray(appDelegate->wispHitsLoc); 
glDisableVertexAttribArray(appDelegate->wispNormalLoc); 

[[appController->wispView openGLContext] flushBuffer]; 

chiunque può vedere qualcosa di sbagliato in questo codice? Ci sono passato molte volte e ho controllato tutti i documenti a cui riesco a pensare.

nello shader frammento, alcune delle dichiarazioni:

in vec2 texCoord; 
uniform sampler2D Texture; 
out vec4 fragColor; 

Ma

fragColor = texture(Texture, texCoord); 

rende uno schermo nero.

ho mantenuto il codice di spedire messaggi sul shader breve perché sono in realtà piuttosto complicato.

Ora ho creato nuovi shader di test che sono abbastanza banale:

Vertex Shader:

#version 410 

in vec4 Position; 
in vec2 TexCoord; 

uniform mat4 ModelMatrix; 
uniform mat4 ViewMatrix; 
uniform mat4 ProjectionMatrix; 

out vec2 texCoord; 

void main() 
{ 

    texCoord = TexCoord; 

    gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * Position; 
} 

Fragment Shader:

#version 410 

in vec2 texCoord; 

uniform sampler2D Texture; 

out vec4 fragColor; 

void main() 
{ 
    fragColor = texture(Texture, texCoord); 
} 

ho ancora ottenere gli stessi risultati con i vari test descritti sopra.

Ho seguito anche il test del codice per gli errori GL ad ogni passaggio, e non ce ne sono.

Apprezzo le brave persone che contribuiscono con il loro tempo e la loro esperienza allo stackoverflow, sono sicuro che i punti di reputazione offerti nella taglia non significano nulla per chiunque possa aiutarmi a chiarire questo aspetto. Capisci solo che lo so e apprezzo il tuo aiuto.

risposta

4

Sto rispondendo alla mia domanda perché non c'erano altre risposte e alla fine ho risolto tutti i miei problemi. Sto solo mettendo un po 'di chiusura su questo.

Dopo aver tracciato il codice, mi sembrava che il codice OpenGL andasse bene, ma c'era un problema con i tempi quando venivano fatte alcune chiamate.

ho spostato tutto il mio codice di inizializzazione dell'applicazione da:

- (void)applicationWillFinishLaunching:(NSNotification *)aNotification 

a:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 

Questo tutto risolto (tra cui un paio di altri problemi fastidiosi che ho capito), e l'applicazione è in esecuzione normalmente di nuovo.

+0

Grazie per la chiusura e la risposta! Stavo leggendo tutto il codice GL e sembrava a posto. Vai IOS! :) – starmole

Problemi correlati