Sampler2D в вычислительных шейдерах, ошибки компиляцииC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Sampler2D в вычислительных шейдерах, ошибки компиляции

Сообщение Anonymous »


Я пытаюсь перенести программу Windows на GNU/Linux, но вычислительный шейдер не компилируется.

У меня есть некоторые знания GLSL. Поэтому мне интересно, есть ли обходные пути, позволяющие заставить шейдер работать.

Я написал минимальный пример, показывающий ошибки компиляции.

Вот вычислительный шейдер:

#версия 430 ядра #расширение GL_ARB_gpu_shader_int64: включить //#расширение GL_ARB_bindless_texture: включить макет (привязка = 1) униформа TextHandles { uvec2text_handles[512]; }; vec3 SampleTexture (uinttexture_index, vec2 uv) { ув.у = 1.ф - ув.у; sampler2D tex_sampler = sampler2D(texture_handles[texture_index]); вернуть текстуруLod(tex_sampler, uv, 0.0f).xyz; } пустая функция() { } Вот ошибки компиляции:

0:11(2): ошибка: переменные изображения/сэмплера могут быть объявлены только как параметры функции или глобальные переменные с унифицированным указанием. 0:11(2): ошибка: непрозрачные переменные должны быть объявлены унифицированными. 0:11(26): ошибка: невозможно инициализировать непрозрачную переменную tex_sampler 0:11(26): ошибка: невозможно создать непрозрачный тип `sampler2D' 0:12(20): предупреждение: `tex_sampler' используется неинициализированный Что касается конструкции непрозрачного типа sampler2D, я прочитал в Интернете, что необходимо включить расширение GL_ARB_bindless_texture, но когда я его включаю, у меня появляется ошибка, сообщающая, что оно не поддерживается в вычислительном шейдере.

Вот минимальная программа, использующая GLEW и GLFW, которая показывает ошибку:
#define GLFW_INCLUDE_NONE #include #define GLEW_STATIC #include #include #include /////////////////////////////////////////////////// /////// // // Шейдерные программы для основного профиля: // константный символ * csprog_core = "#ядро версии 430\n\ #extension GL_ARB_gpu_shader_int64 : включить\n\ //#расширение GL_ARB_bindless_texture : включить\n\ \п\ макет (привязка = 1) униформа TextHandles {\n\ uvec2text_handles[512];\n\ };\n\ \п\ vec3 SampleTexture(uinttext_index, vec2 uv) {\n\ ув.у = 1.f - ув.у;\n\ sampler2D tex_sampler = sampler2D(texture_handles[texture_index]);\n\ вернуть текстуруLod(tex_sampler, uv, 0.0f).xyz;\n\ }\n\ \п\ void main() {\n\ }\n\ \н"; int ширина, высота; void error_callback(int error, const char* описание) { fprintf(stderr, «Ошибка: %s\n», описание); } int main( int argc, char *argv[ ], char *envp[ ] ) { если(!glfwInit()) { выход (EXIT_FAILURE); } glfwSetErrorCallback (error_callback); glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, 3); Окно GLFWwindow* = glfwCreateWindow(640, 480, «Программа», NULL, NULL); если(!окно) { выход (EXIT_FAILURE); } glfwMakeContextCurrent (окно); glfwSwapInterval (1); glfwGetFramebufferSize (окно, ширина, высота); // получаем информацию о версии const GLUbyte* рендерер; версия const GLUbyte*; /////////////////////////////////////////////////// ////////////////////// // // запускаем обработчик расширения GLEW // glewExperimental = GL_TRUE; GLenum err = glewInit(); если(GLEW_OK != ошибка) { fprintf(stderr, "Ошибка: %s\n", glewGetErrorString(err)); возврат (-1); } fprintf(stdout, "Состояние: Использование GLEW %s\n", glewGetString(GLEW_VERSION)); // получаем информацию о версии рендерер = glGetString (GL_RENDERER); // получаем строку рендерера версия = glGetString(GL_VERSION); // версия в виде строки printf("\nРендерер: %s", рендерер); printf("\nПоддерживаемая версия OpenGL %s\n", version); fflush(стандартный вывод); // сообщаем GL рисовать только на пикселе, если фигура ближе к зрителю glEnable (GL_DEPTH_TEST); // включаем тестирование глубины glDepthFunc (GL_LESS); // тестирование глубины интерпретирует меньшее значение как «ближе» /////////////////////////////////////////////////// //////// // // Шейдеры: // Параметры GLint; GLint лен; GLuint cscore = glCreateShader(GL_COMPUTE_SHADER); glShaderSource(cscore, 1, &csprog_core, NULL); glCompileShader (cscore); glGetShaderiv(cscore,GL_COMPILE_STATUS,&params); если (параметры == GL_FALSE) { Журнал GLchar[100000]; glGetShaderInfoLog(cscore,100000,&len,log); printf("\n\n%s\n\n",log); выход (EXIT_FAILURE); } // /////////////////////////////////////////////////// //////// glfwDestroyWindow (окно); glfwTerminate(); выход (EXIT_SUCCESS); }
Ответить

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

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

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

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

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