【问题标题】:OpenGL ES: Pass single float to vertex shader?OpenGL ES:将单个浮点数传递给顶点着色器?
【发布时间】:2016-12-04 12:09:40
【问题描述】:

我正在尝试将单个浮点数传递给我的顶点着色器,以便我可以将 gl_PointSize 设置为该浮点数。但是,它不起作用,我认为这是因为我使用了 glVertexAttribPointer:

glVertexAttribPointer(1, 1, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(MemoryLayout<Vertex>.size), BUFFER_OFFSET(2 * MemoryLayout<Float>.size))

我需要缓冲区偏移量,因为在此之前我还使用 glVertexAttribPointer 设置了位置:

glVertexAttribPointer(0, 2, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(MemoryLayout<Vertex>.size), BUFFER_OFFSET(0))

这是我的顶点结构:

struct Vertex {
  var x, y, size: Float
}

这是顶点着色器:

attribute vec4 Position;
attribute float Size; // I tried vec4, no luck

void main(void) {
  gl_PointSize = Size;
  gl_Position = Position;
}

任何帮助将不胜感激!

【问题讨论】:

  • 是什么让您认为glVertexAttribPointer 电话是罪魁祸首?
  • 当我尝试传输浮点数时,它的名称中有顶点,我想不出还有什么可能导致问题,因为之后另一部分可以正常使用它
  • 嗯,Vertex 并不意味着 Vector。在 GL 中,顶点只是一组 属性,其中每个属性可以是标量或 2 到 4 维向量,因此您可以在这里使用顶点属性。你真的启用顶点属性数组1吗?
  • 是的,在一开始。我是否需要在着色器中将其定义为 vec4,即使它不是或什么?
  • 不,它在索引 1 处设置属性。但您不知道 Size 在索引 1 处,除非您这样设置,例如在链接之前调用 glBindAttribLocation()着色器程序。

标签: ios opengl-es vertex-shader


【解决方案1】:

Reto Koradi 给出了答案!编译着色器时需要事先调用 glBindAttribLocation 才能正确绑定。现在一切正常!

另外,在版主要求我这样做之前,我不能接受他的答案作为正确答案,因为这是对我最初问题的评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多