c++ - 如何使用glVertexAttribPointer()添加非数组值

标签 c++ opengl shader

我知道有uniforms可以解决此问题,但我想知道是否可以使用intglVertexAttribPointer()那样添加值?
着色器:

#version 330 core  
layout (location = 0) in vec3 aPosition;
layout (location = 1) in vec3 aColor;
layout (location = 2) in int aSize;

out vec3 vColor;

void main()  
{  
    gl_Position = vec4(aPosition, 1.0f);
    gl_PointSize = aSize;
    vColor = aColor;
}
编码:
makeCurrent();

glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);

glBufferData(GL_ARRAY_BUFFER, points.vbo.size() * sizeof(GLfloat), &points.vbo.front(), GL_STATIC_DRAW);  //look below to the struct
glVertexAttribPointer(0, points.vertexAmount, GL_FLOAT, GL_FALSE, points.stride * sizeof(GLfloat), (GLvoid *)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, points.colorAmount, GL_FLOAT, GL_FALSE, points.stride * sizeof(GLfloat), (GLvoid *)(points.vertexAmount * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(/* ??? how to add simple int here ??? */);
glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

doneCurrent();
points结构:
struct RenderedObjects
{
    std::vector<float> vbo;
    int vertexAmount = 3;
    int colorAmount = 3;
    int stride = vertexAmount + colorAmount;
    int size = 1;
} points;

最佳答案

glVertexAttribPointer仅适用于数据数组。发出dasw调用时,GPU将获取已启用的每个属性数组的i -th元素,并使用顶点attrib指针数据在VBO中找到该元素。
对于没有启用属性数组的属性输入,可以将值设置为GL状态的一部分。函数家族 glVertexAttib...() 允许您设置通用顶点属性的值。
OpenGL的命名约定可能会使您感到困惑。默认情况下,即使将输入指定为整数(与glVertexAttribPointer()的type参数相同),也始终将顶点属性视为浮点。因此,即使您可能认为glVertexAttrib1i()可以设置标量整数属性的值,实际上也可以通过提供整数值来处理float属性。
稍后将其添加到GL中的Integer属性,您必须使用glVertexAttribI() / glVertexAttribIPointer()(注意大写的字母)。
因此,为layout (location = 2) in int aSize;指定单个常量输入的正确方法是:

 glVertexAttribI1i(2, yourIntegerValue); 
 glDisableVertexAttribArray(2); // do NOT use an array for this attribute
(创建VAO时,最初会禁用所有属性数组,因此您可能不需要在此处显式调用glDisableVertexAttribArray(2)。)

关于c++ - 如何使用glVertexAttribPointer()添加非数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64912390/

相关文章:

java - OpenGL 计算着色器无法在笔记本电脑上链接

c++ - 如何创建变量数组 Arduino

c++ - 如何使编辑控件和丰富控件中的文本无法选择?

c++ - 沿 3d 曲线渲染圆

c - OpenGL 问题 : 'incompatible' vs 'cannot find'

opengl - GLSL 着色器中的恒定浮点值 - 有什么理由使用制服?

c++ - 关于视频游戏编程,你有什么好的书名可以给我吗?

c++ - 如何从 svg 读取 boost::geometry::model::polygon

c++ - 返回对此的右值引用的正确方法

performance - 最快的 OpenCV 2 OpenGL 上下文