C fb0中仅OpenGL的第一个纹理渲染

C fb0中仅OpenGL的第一个纹理渲染,c,opengl,C,Opengl,我试图将两个高斯模糊纹理附加到fbo,以便在着色器中减去它们(在dog中返回c2-c),但第一个纹理会给出奇怪的结果。我试图找到问题,但我不知道它在哪里。如果有人能启发我,我将不胜感激。先谢谢你 下面是C代码: static void draw(void) { static int b1 = 0; static int b2 = 50; glBindFramebuffer(GL_FRAMEBUFFER, _fbo); blur(_vao, b1, _tId, _fboTe

我试图将两个高斯模糊纹理附加到fbo,以便在着色器中减去它们(在dog中返回c2-c),但第一个纹理会给出奇怪的结果。我试图找到问题,但我不知道它在哪里。如果有人能启发我,我将不胜感激。先谢谢你

下面是C代码:

  static void draw(void) {
  static int b1 = 0;
  static int b2 = 50;

  glBindFramebuffer(GL_FRAMEBUFFER, _fbo);

  blur(_vao, b1, _tId, _fboTex[0], 1, 0);  
  glUseProgram(0);  

  blur(_vao, b2, _tId, _fboTex[0], 1, 1);
  glUseProgram(0);

  glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
  glBlitFramebuffer(0, 0, _dim[0], _dim[1], 0, 0, _dim[0], _dim[1], GL_COLOR_BUFFER_BIT, GL_NEAREST);
  //glBlitFramebuffer(0, 0, _dim[0], _dim[1], _dim[0]/2, 0, _dim[0], _dim[1], GL_COLOR_BUFFER_BIT, GL_NEAREST);
  glBindFramebuffer(GL_FRAMEBUFFER, 0);
}

void tex_to_shader(GLuint tid, char * sampler_name, GLuint num_tex){
  glActiveTexture(!num_tex ? GL_TEXTURE0 : GL_TEXTURE1);
  glBindTexture(GL_TEXTURE_2D, 0);  
  glUniform1i(glGetUniformLocation(blurPId, sampler_name), num_tex);
  glBindTexture(GL_TEXTURE_2D, tid);
}

void blur(GLuint plate_vao, GLuint radius, GLuint in, GLuint out, GLuint nb_iterations, GLuint current_texture) {
  int i, n;
  GLuint temp, rin = in;
  glGenTextures(1, &temp);
  glBindTexture(GL_TEXTURE_2D, temp);
  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_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
  radius = radius > MAX_RADIUS ? MAX_RADIUS : radius;

  for(n = 0; n < (int)nb_iterations; n++) {
    for(i = 0; i < 2; i++) {
      glFramebufferTexture2D(GL_FRAMEBUFFER, !current_texture ? GL_COLOR_ATTACHMENT0 : GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, i == 0 ? temp : out,  0);
      glUseProgram(blurPId);
      glUniform1i(glGetUniformLocation(blurPId,  "inv"), i ? 1 : 0);
      glUniform1fv(glGetUniformLocation(blurPId, "weight"), MAX_RADIUS, &weights[(radius * (radius - 1)) >> 1]);
      glUniform2fv(glGetUniformLocation(blurPId, "offset"), MAX_RADIUS, (i % 2) ? offsetH : offsetV);
      glUniform1i(glGetUniformLocation(blurPId,  "nweights"), radius);
      glDisable(GL_DEPTH_TEST);
      glBindVertexArray(plate_vao);
      tex_to_shader(rin, !current_texture ? "blur0" : "blur1", current_texture);
      glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
      glBindVertexArray(0);
      glBindTexture(GL_TEXTURE_2D, 0);
    }
    rin = out;
  }
    glDeleteTextures(1, &temp);
}
静态空心绘制(空心){
静态int b1=0;
静态int b2=50;
glBindFramebuffer(GL_FRAMEBUFFER,_fbo);
模糊(_-vao,b1,_-tId,_-fboTex[0],1,0);
glUseProgram(0);
模糊(_-vao,b2,_-tId,_-fboTex[0],1,1);
glUseProgram(0);
glBindFramebuffer(GL\u DRAW\u FRAMEBUFFER,0);
glBlitFramebuffer(0,0,_dim[0],_dim[1],0,0,_dim[0],_dim[1],GL_颜色缓冲位,GL_最近);
//glBlitFramebuffer(0,0,_dim[0],_dim[1],_dim[0]/2,0,_dim[0],_dim[1],GL_颜色缓冲位,GL_最近);
glBindFramebuffer(GL_帧缓冲区,0);
}
void tex_to_着色器(GLuint tid,char*sampler_name,GLuint num_tex){
glActiveTexture(!num_tex?GL_TEXTURE0:GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D,0);
glUniform1i(glGetUniformLocation(blurPId,取样器名称),num_tex);
glBindTexture(GLU纹理2D,tid);
}
空洞模糊(胶合板、胶合半径、胶合输入、胶合输出、胶合nb\U迭代、胶合当前纹理){
inti,n;
胶合温度,rin=英寸;
glGenTextures(1号和临时);
glBindTexture(GL_纹理_2D,温度);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理包裹S、GL_重复);
glTexParameteri(GL_纹理2D、GL_纹理包裹、GL_重复);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA,宽度,高度,0,GL_RGBA,GL_无符号_字节,NULL);
半径=半径>最大半径?最大半径:半径;
对于(n=0;n<(int)nb_迭代;n++){
对于(i=0;i<2;i++){
glFramebufferTexture2D(GL_帧缓冲区,当前纹理?GL_颜色?附件0:GL_颜色?附件1,GL_纹理?2D,i==0?温度:输出,0);
glUseProgram(blurPId);
glUniform1i(glgetuniformllocation(blurPId,“inv”),i?1:0;
glUniform1fv(glGetUniformLocation(blurPId,“重量”)、最大半径和重量[(半径*(半径-1))>>1]);
glUniform2fv(glGetUniformLocation(blurPId,“偏移”),最大半径(i%2)?偏移:偏移电视);
glUniform1i(glGetUniformLocation(blurPId,“nweights”),半径;
glDisable(GLU深度测试);
glBindVertexArray(板材);
纹理到纹理着色器(rin,!当前纹理?“blur0”:“blur1”,当前纹理);
gldrawArray(GL_三角带,0,4);
glBindVertexArray(0);
glBindTexture(GL_TEXTURE_2D,0);
}
rin=out;
}
glDeleteTextures(1和温度);
}
这是我们的片段着色器:

#version 330

uniform sampler2D blur0;
uniform sampler2D blur1;

uniform int current_texture;
uniform int nweights;
uniform float weight[128];
uniform vec2 offset[128];

in  vec2 vsoTexCoord;
out vec4 fragColor;

vec4 dog(sampler2D a, sampler2D b){

    vec4 c  = texture(a, vsoTexCoord.st) * weight[0];
    vec4 c2 = texture(b, vsoTexCoord.st) * weight[0];

    for (int i = 1; i < nweights; i++) {
        c  += texture(a, vsoTexCoord.st + offset[i]) * weight[i];
        c  += texture(a, vsoTexCoord.st - offset[i]) * weight[i];
        c2 += texture(b, vsoTexCoord.st + offset[i]) * weight[i];
        c2 += texture(b, vsoTexCoord.st - offset[i]) * weight[i];
    }
    return c;
}

vec4 gray(vec4 c){
  float moyenne = 0.2126 * c.r + 0.7152 * c.g + 0.0722 * c.b;
  return vec4(moyenne, moyenne, moyenne, 1.0);
}

void main(void) {

  fragColor = dog(blur0,blur1);
  //fragColor = gray(fragColor);
}
#版本330
均匀取样器0;
均匀取样器1;
均匀的电流纹理;
统一国际重量;
均匀浮重[128];
均匀vec2偏移量[128];
在vec2 vsoTexCoord中;
out vec4 fragColor;
vec4狗(采样器2D a、采样器2D b){
vec4 c=纹理(a,vsoTexCoord.st)*权重[0];
vec4 c2=纹理(b,vsoTexCoord.st)*权重[0];
对于(int i=1;i
如果使用具有多个颜色附件的帧缓冲区,则必须指定应写入的颜色附件。应在其中绘制的颜色缓冲区可以由指定

e、 g.如果仅应在
GL\u COLOR\u ATTACHMENT1
上绘制,则可以如下指定:

GLenum attachment = GL_COLOR_ATTACHMENT1;
glDrawBuffers(1, &attachment); 
在这种情况下,您必须在功能开始时选择正确的颜色附件
blur

void blur(GLuint plate_vao, GLuint radius, GLuint in, GLuint out,
    GLuint nb_iterations, GLuint current_texture) {

    GLenum attachment = !current_texture ? GL_COLOR_ATTACHMENT0 : GL_COLOR_ATTACHMENT1;
    glDrawBuffers(1, &attachment);  

    .....
}

谢谢你的帮助。我测试了你的解决方案,但是第一个附加的纹理(狗的变量c)仍然是随机的。还缺什么吗?