Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 从纹理渲染到屏幕外纹理(FBO)_Opengl_Textures_Glsl_Gpgpu_Fbo - Fatal编程技术网

Opengl 从纹理渲染到屏幕外纹理(FBO)

Opengl 从纹理渲染到屏幕外纹理(FBO),opengl,textures,glsl,gpgpu,fbo,Opengl,Textures,Glsl,Gpgpu,Fbo,我试图编写一个GPGPU程序,只需将纹理的内容复制到附加到FBO的输出纹理。但是,我发现输入的纹理数据没有正确加载/绑定。我不明白怎么了 这是我的密码: void render() { int i; float * result, *in; //allocating and filling data in the input texture result = (float * ) malloc(4*32*32*sizeof(float)); in = (float *)

我试图编写一个GPGPU程序,只需将纹理的内容复制到附加到FBO的输出纹理。但是,我发现输入的纹理数据没有正确加载/绑定。我不明白怎么了

这是我的密码:

void render()
{

  int i;
  float * result, *in;

  //allocating and filling data in the input texture

  result = (float * ) malloc(4*32*32*sizeof(float));
  in = (float *) malloc(4*32*32*sizeof(float));
  for(i=0;i<32*32*4; i++)
  {
    in[i]=1.0f;
  }


makeBuffers(); //makes the vertex and element buffers
makeTexture(in);  //makes the input textures
makeShaders();    //makes the vertex n pixel shaders
makeProgram();   //makes the program

glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);

glBindBuffer(GL_ARRAY_BUFFER, res.vertexBuffer);
glVertexAttribPointer(res.position, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*2, (void*)0);
glEnableVertexAttribArray(res.position);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, res.elementBuffer);
res.texture= glGetUniformLocation(res.shaderProgram, "intexture");
下面是我的FrameBufferProject准备和输出纹理拼接:

glGenFramebuffers(1, &res.fbo);
glBindFramebuffer(GL_FRAMEBUFFER, res.fbo);
glViewport(0, 0, 32, 32);

glGenTextures(1, &res.tex);
glBindTexture(GL_TEXTURE_2D, res.fbo);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 
         32, 32, 0, GL_RGBA, GL_FLOAT, 0);
 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, 
                      GL_COLOR_ATTACHMENT0, 
                      GL_TEXTURE_2D, res.tex, 0);
数据似乎没有被正确读取。我尝试将输入纹理附加到帧缓冲区对象,并尝试立即读回纹理数据,然后数据会显示得很好。但当我试图渲染到屏幕外的纹理时,它无法提供正确的输出。它在像素着色器执行结束时仅给出一组零

像素着色器获取输入纹理并将数据复制到输出纹理:outColor=texture2D(intexture,texcoord)


有人能看出这有什么问题吗?

您的代码缺少很多上下文,但我的印象是,您只需将所有内容绑定一次就可以了。这不是它的用途,也可能不起作用


基本要点是,如果纹理用作FBO渲染目标,则它不得用作采样源。因此,您必须根据需要解除纹理/FBO的绑定,这样东西就不会相互碰撞,或者加载着色器,这样就可以简单地进行禁止的纹理访问。IMHO解除绑定是一个更简单的选项(但是OpenGL-4.4发布了一个无绑定纹理扩展,它可能在4.5中成为核心)。

请不要说你创建了纹理、fbo、vao等。每次渲染一帧。我不是每次都渲染,这是一次性操作。我只需要对数据进行一次处理。是的,我将所有内容绑定一次,因为我只需要对数据进行一次处理。我不会再渲染了。关于解除绑定:我正在尝试按原样将输入纹理复制到输出纹理,这是否意味着输入和输出纹理应同时绑定到渲染目标?@saipallavi:不,这意味着完全不这样做。使用
glFramebufferTexture
将输出纹理作为颜色附件绑定到FBO。必须通过使用
glBindTexture
将输入纹理绑定到纹理单元,将其选择为采样源。
 glGenTextures (1, &res.texture);
glBindTexture(GL_TEXTURE_2D,res.texture);
// set texture parameters
glTexParameteri(GL_TEXTURE_2D,
                GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,
                GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,
                GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,
                GL_TEXTURE_WRAP_T, GL_CLAMP);
// define texture with floating point format
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA32F,
             texSize,texSize,0,GL_RGBA,GL_FLOAT,0);

// transfer data to texture
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,texSize,texSize,
                GL_RGBA,GL_FLOAT,data);
glGenFramebuffers(1, &res.fbo);
glBindFramebuffer(GL_FRAMEBUFFER, res.fbo);
glViewport(0, 0, 32, 32);

glGenTextures(1, &res.tex);
glBindTexture(GL_TEXTURE_2D, res.fbo);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 
         32, 32, 0, GL_RGBA, GL_FLOAT, 0);
 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, 
                      GL_COLOR_ATTACHMENT0, 
                      GL_TEXTURE_2D, res.tex, 0);