Сэмплер текстур GLSL не работает после обновления до OS 10.11, Xcode 7.0.1

У меня есть приложение OpenGL (4.1), которое я создаю в Xcode, которое нормально работало до обновления, но теперь ничего не записывает в представление OpenGL. Приложение строится без ошибок или предупреждений, а шейдеры GLSL компилируются и связываются без ошибок.

Я провел несколько тестов, чтобы убедиться, что шейдеры в основном работают:

Если последняя строка фрагментного шейдера:

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

Окно OpenGL полностью красное, как и должно быть. Я думаю, это также подтверждает, что данные вершин передаются правильно. Я могу анимировать вид, чтобы вращаться вокруг любой оси, и снова вижу, что данные вершин (включая глубины) передаются правильно.

Если последняя строка фрагментного шейдера либо:

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

or

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

Я получаю красный градиент в направлении x или y, указывая мне, что координаты текстуры также передаются правильно.

Поэтому я думаю, что сами данные текстуры по какой-то причине не передаются в сэмплер. Вот соответствующий код.

Код, создающий текстуру:

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]);

Источник данных для вызова glTexImage2D сейчас нулевой, потому что я загружаю его позже в приложении. Приложение создает данные изображения текстуры, но пока что просто для проверки работы шейдеров я загружаю его в сплошной белый цвет с помощью:

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;
}

где wispBitmapData объявлен как:

AlphaPixelBytes wispBitmapData[NUMTEXTUREPOINTS];

а AlphaPixelBytes определяется как структура:

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

Код для рисования изображения:

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];

Может ли кто-нибудь увидеть что-то не так с этим кодом? Я читал это много раз и проверил все документы, которые мог придумать.

Во фрагментном шейдере некоторые объявления:

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

Но

fragColor = texture(Texture, texCoord);

отображает черный экран.

Я оставил сообщение кода о шейдерах кратким, потому что на самом деле они довольно сложные.

Теперь я создал новые тестовые шейдеры, которые довольно тривиальны:

Вершинный шейдер:

#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;
}

Фрагментный шейдер:

#version 410

in vec2 texCoord;

uniform sampler2D Texture;

out vec4 fragColor;

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

Я по-прежнему получаю те же результаты с различными тестами, описанными выше.

Я также проследил тестирование кода на наличие ошибок GL на каждом этапе, и их нет.

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


person jwlaughton    schedule 10.10.2015    source источник


Ответы (1)


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

После трассировки кода мне показалось, что с кодом OpenGL все в порядке, но возникла проблема с синхронизацией, когда выполнялись некоторые из вызовов.

Я переместил весь код инициализации своего приложения из:

- (void)applicationWillFinishLaunching:(NSNotification *)aNotification

to:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

Это решило все (включая несколько других неприятных проблем, которые я теперь понимаю), и приложение снова работает нормально.

person jwlaughton    schedule 18.10.2015
comment
Спасибо, что закрыли и ответили на него! Я читал весь код GL, и все выглядело нормально. Перейти на IOS! :) - person starmole; 20.10.2015