GL_INVALID_OPERATION настройка image2D в ComputeShaderJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 GL_INVALID_OPERATION настройка image2D в ComputeShader

Сообщение Anonymous »

Я использую OpenGL ES 3.2 и драйвер NVIDIA 361.00 на планшете Pixel C с графическим процессором Tegra X1. Я хотел бы использовать вычислительный шейдер для записи данных в карту цветов, а затем позже я буду использовать некоторые графические шейдеры для отображения изображения.

У меня уже есть эта концепция, работающая с использованием GL для настольных компьютеров, и теперь я хочу перенести ее на мобильные устройства. Я реализую GL на Java, а не в собственном коде. Я расширяю GLSurfaceView и GLSurfaceView.Renderer, а затем во время обратного вызова OnSurfaceCreated инициализирую шейдерные программы, текстуры и т. д.

Вычислительный шейдер компилируется без ошибок:

Код: Выделить всё

#version 310 es
layout(binding = 0, rgba32f) uniform highp image2D colourMap;
layout(local_size_x = 128, local_size_y = 1, local_size_z = 1) in;

void main()
{
imageStore(colourMap, ivec2(gl_GlobalInvocationID.xy), vec4(1.0f, 0.0f, 0.0f, 1.0f));
}
И я инициализирую текстуру

Код: Выделить всё

// Generate a 2D texture
GLES31.glGenTextures(1, colourMap, 0);
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, colourMap[0]);

// Set interpolation to nearest
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MAG_FILTER, GLES31.GL_LINEAR);
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MIN_FILTER, GLES31.GL_LINEAR);

// Create some dummy texture to begin with so we can see if it changes
float texData[] = new float[texWidth * texHeight * 4];
for (int j = 0; j < texHeight; j++)
{
for (int i = 0; i < texWidth; i++)
{
// Set a few pixels in here...
}
}
Buffer texDataBuffer = FloatBuffer.wrap(texData);
GLES31.glTexImage2D(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_RGBA32F, texWidth, texHeight, 0, GLES31.GL_RGBA, GLES31.GL_FLOAT, texDataBuffer);
После этого я устанавливаю здесь единицу изображения в шейдере: РЕДАКТИРОВАТЬ: Я не делаю этого сейчас, а просто предполагаю, что она будет назначена автоматически, когда программа шейдера будет создана в соответствии с ответом SolidPixel.

Код: Выделить всё

GLES31.glUseProgram(idComputeShaderProgram);
int loc = GLES31.glGetUniformLocation(idComputeShaderProgram, "colourMap");
if (loc == -1) Log.e("Error", "Cannot locate variable");
GLES31.glUniform1i(loc, 0);
После каждого вызова GL я проверяю наличие ошибок с помощью GLES31.glGetError() — оставлен здесь для ясности.

РЕДАКТИРОВАТЬ: Когда я отправляю вычисления, я привязываю текстуру изображения, но сначала запрашиваю назначение единицы измерения:

Код: Выделить всё

GLES31.glUseProgram(idComputeShaderProgram);
int[] unit = new int[1];
GLES31.glGetUniformiv(idComputeShaderProgram, GLES31.glGetUniformLocation(idComputeShaderProgram, "colourMap"), unit, 0);
GLES31.glBindImageTexture(unit[0], velocityMap[0], 0, false, 0, GLES31.GL_WRITE_ONLY, GLES31.GL_RGBA32F);
Эта последняя строка сейчас вызывает ошибку. Код ошибки преобразуется в GL_INVALID_OPERATION. Шейдер компилируется правильно, а программный объект действителен и активен. Местоположение переменной также допустимо. Я даже использовал glGetActiveUniform(), чтобы получить тип переменной, и она возвращает тип 36941, который преобразуется в GL_IMAGE_2D, который, как я считаю, является целым числом.

Я все еще думаю, что что-то здесь не понимаю, но не уверен, что именно.

Подробнее здесь: https://stackoverflow.com/questions/490 ... puteshader
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»