C OpenGL&x2B;SDL2和x2B;计算着色器=黑屏

C OpenGL&x2B;SDL2和x2B;计算着色器=黑屏,c,opengl,glsl,sdl,compute-shader,C,Opengl,Glsl,Sdl,Compute Shader,我正在将C光线跟踪器转换为glsl,以便在计算着色器中使用它。现在我只是想在屏幕上呈现一些模糊的图案。没有编译错误,但是没有呈现任何内容 我遵循这两个教程(后者相当不完整,遗漏了一些部分,我可能遗漏了一些内容) 我不是opengl专家,所以我不确定着色器是否输出到纹理?还是没有绘制纹理?还是问题在别处 请发布准确的语法,而不是像“您需要通过初始化y和刷新z来执行x”这样的模糊指令,因为我可能不知道执行xyz的语法 请注意:主程序仍然在C,而不是C++。 编译时使用:-std=gnu18-ffa

我正在将C光线跟踪器转换为glsl,以便在计算着色器中使用它。现在我只是想在屏幕上呈现一些模糊的图案。没有编译错误,但是没有呈现任何内容

我遵循这两个教程(后者相当不完整,遗漏了一些部分,我可能遗漏了一些内容)

我不是opengl专家,所以我不确定着色器是否输出到纹理?还是没有绘制纹理?还是问题在别处

请发布准确的语法,而不是像“您需要通过初始化y和刷新z来执行x”这样的模糊指令,因为我可能不知道执行xyz的语法

请注意:主程序仍然在C,而不是C++。 编译时使用:
-std=gnu18-ffast math-O3-lm-lGLEW-lGL-lglut-Wall-pedantic-Werror-Wshadow-Wstrict别名-Wstrict溢出

#包括
#包括
#包括
#包括
#包括
#定义GLEW_静态
#包括
#包括
#包括
#包括
内部主(空)
{
int tex_w=1920;
int-tex_h=1080;
//////////////////////
//
//SDL材料
if(SDL_Init(SDL_Init_视频)<0){
printf(“SDL无法初始化!SDL_错误:%s\n”,SDL_GetError());
返回退出失败;
}
SDL_窗口*窗口;
window=SDL\u CreateWindow(
“渲染第一帧”,
SDL_窗口位置未定义,
SDL_窗口位置未定义,
tex_w*比例,
特克斯比例尺,
SDL_WINDOW_OPENGL | SDL_WINDOW_可调整大小
);
如果(窗口==NULL){
printf(“无法创建窗口!SDL_错误:%s\n”,SDL_GetError());
返回退出失败;
}
#ifdef全屏
SDL_设置窗口全屏(窗口、SDL_窗口全屏桌面);
#恩迪夫
SDL_事件;
//////////////////////
//
//GL材料
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GLContext GLContext=SDL_GL_CreateContext(窗口);
if(glContext==NULL){
printf(“无法创建OpenGL上下文!SDL错误:%s\n”,SDL_GetError());
返回退出失败;
}
glewInit();
胶合特克斯输出;
glGenTextures(1和tex_输出);
玻璃纹理(GL_纹理0);
glBindTexture(GL_纹理_2D,tex_输出);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA32F,tex_w,tex_h,0,GL_RGBA,GL_浮点,NULL);
glBindImageTexture(0,tex_输出,0,GL_假,0,GL_仅写,GL_RGBA32F);
//////////////////////
//
//初始化计算着色器
const GLchar*_ray_shader_string=“#ifdef GL_ES”\
精密中泵浮子\
#恩迪夫\
\
#扩展GL_OES_标准_衍生工具:启用\
\
均匀浮动时间\
均匀vec2小鼠\
均匀vec2分辨率\
布局(本地大小x=1,本地大小y=1)in\
布局(rgba32f,绑定=0)均匀图像2D img_输出\
\
真空总管(真空){\
\
vec2位置=(gl_FragCoord.xy/resolution.xy)+鼠标/4.0\
\
浮动颜色=0.0\
颜色+=sin(位置x*cos(时间/15.0)*80.0)+cos(位置y*cos(时间/15.0)*10.0)\
颜色+=sin(位置y*sin(时间/10.0)*40.0)+cos(位置x*sin(时间/25.0)*40.0)\
颜色+=sin(位置x*sin(时间/5.0)*10.0)+sin(位置y*sin(时间/35.0)*80.0)\
颜色*=sin(时间/10.0)*0.5\
\
gl_FragColor=vec4(vec3(颜色,颜色*0.5,sin(颜色+时间/3.0)*0.75),1.0)\
\
}\0";
GLuint光线着色器=glCreateShader(GL计算着色器);
glShaderSource(光线着色器,1和光线着色器字符串,NULL);
glCompileShader(光线着色器);
GLuint ray_program=glCreateProgram();
glAttachShader(ray_程序,ray_着色器);
GLLINK计划(雷欧计划);
int delta,leftToWait;
int startTime,i=0;
当(++i&&D运行时)
{
startTime=SDL_GetTicks();
SDL_PollEvent(事件和事件);
demoHandleInput(和事件);
glClear(GLU颜色缓冲位);
玻璃纹理(GL_纹理0);
glBindTexture(GL_纹理_2D,tex_输出);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glUseProgram(射线程序);
glDispatchCompute((GLuint)tex_w,(GLuint)tex_h,1);
glMemoryBarrier(GL_着色器_图像_访问_屏障_位);
SDL_GL_SwapWindow(窗口);
delta=SDL_GetTicks()-startTime;
leftToWait=(16-delta);//以每秒60帧为目标
如果(leftToWait>0){
SDL_延迟(leftToWait);
}
}
SDL_窗口(窗口);
SDL_退出();
返回退出成功;
}

您所谓的计算着色器实际上不仅仅是一个
gl_FragCoord
是一个片段着色器内置输入,
gl_FragColor
是一个(不推荐使用的)片段着色器输出变量。附加到
GL\u COMPUTE\u着色器
SHADER对象时,此着色器将无法编译

您必须使用来标识调用,并且必须使用来将texel写入输出图像(
img\u output
)。e、 g:

#版本460
均匀浮动时间;
均匀vec2小鼠;
均匀vec2分辨率;
布局(本地大小x=1,本地大小y=1)in;
布局(rgba32f,绑定=0)均匀图像2D img_输出;
真空总管(真空){
vec2位置=vec2(gl_globalinovationid.xy)/resolution.xy+鼠标/4.0;
浮动颜色=0.0;
颜色+=sin(位置x*cos(时间/15.0)*80.0)+cos(位置y*cos(时间/15.0)*10.0);
颜色+=sin(位置y*sin(时间/10.0)*40.0)+cos(位置x*sin(时间/25.0)*40.0);
颜色+