无法将颜色传递给 FragmentShader

Posted

技术标签:

【中文标题】无法将颜色传递给 FragmentShader【英文标题】:Can't pass color to FragmentShader 【发布时间】:2021-06-05 15:44:39 【问题描述】:

我试图通过我的主函数传递我的三角形的颜色,但是当我尝试这样做时,我的三角形只会变成白色,就像它没有片段着色器一样

顶点着色器:

#version 330 core

layout (location = 0) in vec3 position;
layout (location = 1) in vec3 aColor;

out vec3 color;

void main()

    gl_Position = position
    color = aColor;

片段着色器:

#version 330 core

in vec3 color;
out vec4 FragColor;

void main()

 FragColor = vec4(color, 1.0);
;

主要代码:

 float positions[] = 
      -0.5f, -0.5f, 0.f, 0.8f, 0.3f, 0.02f,                       //inferior esquerdo
      0.5, -0.5f, 0.f, 0.8f, 0.3f, 0.2f,                          //inferior direito
      0.0f, (sqrt(3.f) - 1.f) / 2.f, 0.f, 1.f, 0.6f, 0.32f,       //Topo
      -0.5f / 2.f, (0.37f - 0.5f) / 2.f, 0.f, 0.9f, 0.45f, 0.17f, //Meio esquerdo
      0.5f / 2, (0.37f - 0.5f) / 2.f, 0.f, 0.9f, 0.45f, 0.17f,    //Meio direito
      0.f, -0.5f, 0.f, 0.8f, 0.3f, 0.02f;                        //Meio
 unsigned int indices[9] =
      
          0, 5, 3,
          5, 1, 4,
          3, 4, 2;

  unsigned int buffer, attribute, EBO;
  //Gera o Shader
  struct Shader shaderProgram = beginShader("res/shaders/sv1.shader", "res/shaders/sf1.shader");
  //Gerao Vertex Array Object e bainda ele
  struct VAO vao1 = beginVAO();
  vao1.Bind(vao1);

  //Gera o Vertex Buffer linkando-o ao vértice
  struct VBO vbo1 = beginVBO(positions, sizeof(positions));
  //Gera o Element Buffer e linka ele com os índices do vetor posições
  struct EBO ebo1 = beginEBO(indices, sizeof(indices));

  //Conecta o VBO ao VAO
  vao1.LinkAttrib(vbo1, 0, 3, GL_FLOAT, 6 * sizeof(float), (void *)0);
  vao1.LinkAttrib(vbo1, 1, 3, GL_FLOAT, 6 * sizeof(float), (void *)(3 * sizeof(float)));
  //Unbind em todos os objetos que foram bindados
  vao1.Unbind(vao1);
  vbo1.Unbind(vbo1);
  ebo1.Unbind(ebo1);

  while (true)
  
    if (SDL_PollEvent(&windowEvent))
    
      if (SDL_QUIT == windowEvent.type)
      
        break;
      
    
    glClearColor(0.05f, 0.57f, 0.38f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    shaderProgram.Activate(shaderProgram);
    vao1.Bind(vao1);
    glDrawElements(GL_TRIANGLES, 9, GL_UNSIGNED_INT, 0);
    glEnd();
    SDL_GL_SwapWindow(window); //update the window
  
  vao1.Delete(vao1);
  vbo1.Delete(vbo1);
  ebo1.Delete(ebo1);
  shaderProgram.Delete(shaderProgram);
  SDL_DestroyWindow(window);
  SDL_Quit();

LinkAttrib 函数:

void LinkAttrib(struct VBO VBO, GLuint layout, GLuint numComponents, GLenum type, 
GLsizeiptr stride, void *offset)

 VBO.Bind(VBO);
 glVertexAttribPointer(layout, numComponents, type, GL_FALSE, stride, offset);
 glEnableVertexAttribArray(layout);
 VBO.Unbind(VBO);

因为我是用 C 语言编写的,所以我创建的函数必须将自己的结构作为参数传递,我让函数开始将其归因于每个试图模拟对象的函数。函数 begin shader 获取带有着色器的文件并编译它们并生成 Program Shader,begin VAO 生成顶点数组对象 这是我的平局

【问题讨论】:

我忘了着色器,对不起 我放了,还是不行,不过是个开始 片段着色器中main函数体后面有一个虚假的; 你确定着色器文件被正确读取了吗? 为什么你的代码中有glEnd 【参考方案1】:

顶点着色器无法编译有两个原因:

    gl_Position = position 之后缺少; gl_Positionposition 有不同的类型

gl_Position = position

gl_Position = vec4(position, 1.0);

【讨论】:

@EduardoMosca 着色器现在很好。着色器代码中没有进一步的错误。

以上是关于无法将颜色传递给 FragmentShader的主要内容,如果未能解决你的问题,请参考以下文章

在 Material UI 中,如何动态地将颜色传递给我的样式?

将“git difftool”传递给寻呼机时如何保持颜色

将结果集值传递给另一个类

将触摸传递给 UIView

通过顶点属性指针将颜色坐标传递到顶点着色器

在反应组件中将样式作为道具传递