2015-12-28 3 views
2

У меня есть код рисования, который сначала рисует фон без texure, а затем накладывает текстуру поверх него. В настоящее время я использую glBindTexture(GL_TEXTURE_2D, 0), чтобы удалить привязку текстуры после выполнения второй партии рисунка.Правильный способ развязать Open GL ES текстуру?

Однако это порождает следующее предупреждение, когда я анализировать производительность GPU в Xcode:

enter image description here

Когда я удалить код для ун-привязываем текстуру, предупреждение исчезает, но все Арен» t правильно. Текстура, которую я рисую, не поддерживает mipmapping, поэтому она не идет оттуда.

Drawing Код:

glClear(GL_COLOR_BUFFER_BIT); 

{ // Drawing 

    glViewport(0, 0, frameWidth, frameHeight); 

    GLuint vertexCount = animBuffer.vertexCounts[animIndex]; 

    glBindBuffer(GL_ARRAY_BUFFER, animBuffer.vertexBuffers[animIndex]); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, animBuffer.indexBuffers[animIndex]); 

    glVertexAttribPointer(positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(vertex), 0); 
    glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(vertex), (GLvoid*)(sizeof(float)*3)); 
    glVertexAttribPointer(textureCoordSlot, 2, GL_FLOAT, GL_FALSE, sizeof(vertex), (GLvoid*)(sizeof(float)*7)); 

    glDrawElements(GL_TRIANGLE_STRIP, vertexCount, GL_UNSIGNED_SHORT, 0); 


    // glEnable(GL_TEXTURE_2D) (tried this, gives another warning) 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glUniform1i(textureUniform, 0); 

    glBindBuffer(GL_ARRAY_BUFFER, textureColorBuffer); // Transparent color buffer to allow texture to be overlayed. 
    glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(sizeof(float)*3)); 

    glDrawElements(GL_TRIANGLE_STRIP, vertexCount, GL_UNSIGNED_SHORT, 0); 

    // Unbind texture.... this line is causing the error. 
    glBindTexture(GL_TEXTURE_2D, 0); 

    // glDisable(GL_TEXTURE_2D) (tried this, gives another warning)  
} 

[context presentRenderbuffer:GL_RENDERBUFFER]; 

Texture Загрузка Код:

CGImageRef textureImage = image.CGImage; 

size_t width = CGImageGetWidth(textureImage); 
size_t height = CGImageGetHeight(textureImage); 

GLubyte* spriteData = malloc(width*height*4); 

CGColorSpaceRef cs = CGImageGetColorSpace(textureImage); 
CGContextRef c = CGBitmapContextCreate(spriteData, width, height, 8, width*4, cs, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
CGColorSpaceRelease(cs); 

CGContextScaleCTM(c, 1, -1); 
CGContextTranslateCTM(c, 0, -CGContextGetClipBoundingBox(c).size.height); 

CGContextDrawImage(c, (CGRect){CGPointZero, {width, height}}, textureImage); 
CGContextRelease(c); 

GLuint glTex; 
glGenTextures(1, &glTex); 
glBindTexture(GL_TEXTURE_2D, glTex); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 


glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData); 

glBindTexture(GL_TEXTURE_2D, 0); 

free(spriteData); 

return glTex; 

Как я должен идти о не-связывании текстур, чтобы удалить это предупреждение?

EDIT:

Я попытался с помощью glEnable(GL_TEXTURE_2D) & glDisable(GL_TEXTURE_2D) до и после текстурированного рисунка, хотя это теперь дает мне следующее предупреждение:

enter image description here

+0

Это предупреждение может уйти, если вы явно установить 'GL_TEXTURE_MAX_LOD' каждого не-мип текстуры 0 через 'glTexParameter'. – derhass

+0

Не удается найти этот параметр 'GL_TEXTURE_MAX_LOD' ... он устарел в ES 2.0? – Hamish

+0

Извините, мой плохой. 'GL_TEXTURE_MAX_LOD' недоступен в ES. – derhass

ответ

0

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

Итак, перед нанесением просто добавить:

glUniform1i(drawTexInput, GL_FALSE); // Or GL_TRUE to draw. 

И в пиксельный шейдер:

varying lowp vec4 destinationColor; 

uniform bool drawTex; 
varying lowp vec2 texCoordOut; 
uniform sampler2D tex; 

void main() { 

    lowp vec4 result; 
    if (drawTex) { 
     lowp vec4 tex2D = texture2D(tex, texCoordOut); 
     result = tex2D + vec4(1.0 - tex2D.a) * destinationColor; // Alpha blending 
    } else { 
     result = destinationColor; 
    } 

    gl_FragColor = result; 
} 
Смежные вопросы