C++ 不正确的插值、opengl索引vbo、顶点结构和glsl

C++ 不正确的插值、opengl索引vbo、顶点结构和glsl,c++,opengl,glsl,C++,Opengl,Glsl,编辑:添加到问题底部,创建\u顶点和\u索引成员。(并在渲染函数中添加了对GlenableVertexAttributeArray的缺少调用) 我有一个问题,可能会归结为我误解了一些概念,所以写在这里,希望能澄清这一点 我有一个问题,似乎是一个相当简单的着色器,或者我猜问题在于数据传输到着色器 基本上,我正在尝试用一个三角形来完成这项工作,但我仍然得到了一个对我来说似乎出乎意料的结果 我有opengl代码,将把它和着色器源代码一起带到这里,希望有人能给我指出正确的方向 首先,让我们从着色器开始,

编辑:添加到问题底部,创建
\u顶点
\u索引
成员。(并在渲染函数中添加了对
GlenableVertexAttributeArray
的缺少调用)

我有一个问题,可能会归结为我误解了一些概念,所以写在这里,希望能澄清这一点

我有一个问题,似乎是一个相当简单的着色器,或者我猜问题在于数据传输到着色器

基本上,我正在尝试用一个三角形来完成这项工作,但我仍然得到了一个对我来说似乎出乎意料的结果

我有opengl代码,将把它和着色器源代码一起带到这里,希望有人能给我指出正确的方向

首先,让我们从着色器开始,因为它们非常简单

顶点着色器:

#version 330
in vec2 vertex_position;
in vec4 color;

smooth out vec4 vertex_color;

void main () {
    gl_Position = vec4(vertex_position, 0.0, 1.0);
    vertex_color = color;
}
片段着色器: #330版 在vec4顶点颜色中平滑; 输出vec4片段颜色

void main () {
    fragment_color = vertex_color;
}
预期结果:

#version 330
in vec2 vertex_position;
in vec4 color;

smooth out vec4 vertex_color;

void main () {
    gl_Position = vec4(vertex_position, 0.0, 1.0);
    vertex_color = color;
}
我的期望是,如果我发送一个带有顶点颜色的三角形=
[1,0,0],[0,1,0],[0,0,1]
,它会给我一个从红色到蓝色,从红色到绿色插值的三角形(如果这有意义,这是一个很常见的例子,所以我相信人们知道该期待什么?)

我得到的似乎是一个实心的三角形,它被插值在一些倾向于淡绿色的值之间

因此,有了这些信息,我相信我们可以非常确定问题不在于着色器,而在于我们放入其中的数据,对吗

因此,我们继续讨论数据

顶点结构

typedef struct _gui_vertex {
    union {
        struct {float x, y;};
        float position[2];
    };
    union {
        struct {float r, g, b, a;};
        float color[4];
    };
};
我有点喜欢这样的布局,如果我没有遗漏一些基本的东西,它应该是刚性的,我使用union基本上是一种语法糖,因此我可以以不同的方式访问数据,但是
float x,y
应该是内存方面的,与
position[2]
相同,所以我不认为数据类型是罪魁祸首。留下opengl的一部分,我确实认为这是罪魁祸首

我有一个名为
GUI\u Element
(或者实际上是GUI::Element)的类,但我将不使用名称空间,因为我认为它更容易阅读和理解)

类的声明如下所示:

gui\u元素.h

class GUI_Element {
public:
    void render();
private:
    void create_buffers();

    gui_vertex _vertices[4];
    GLuint _indices[4];

    GLuint _vertex_buffer;
    GLuint _index_buffer;
};
对于实现,我将首先介绍
create_buffers()函数,然后是
渲染
函数。假设数据已分配给
\u顶点
\u索引
数组,我已在各个执行点对它们进行了检查,它们确实包含具有红色、蓝色和绿色顶点的三角形的正确数据,以及正确的索引

实现创建缓冲区()

至于渲染函数,我将在这里引用它时尽量使它接近我的实现,但我已经“简化了它”,因为它包含处理属性等的包装依赖项(着色器通信)。我非常确定包装“有效”但是我很乐意看到可能有什么地方出了问题,如果我发布的代码看起来是正确的,我可以更深入地了解这个实现,但是我相信如果我把代码控制在最低限度,读起来会更好

实现渲染()

基本上就是这样,在实现中,
program->attribute_index
函数将索引映射到属性,使用
glgetAttriblLocation
,使用哈希表跟踪它们,这并没有什么神奇之处。渲染的“设置”非常简单,我正在做一个没有深度缓冲区的正交,没有更多要说的

可能是
render
函数和
glvertexattributepointer
文件中的某个地方出错了?似乎最有可能的是,也许我正在考虑补偿,并以错误的方式填充

不管怎样,我很感谢你花时间看这个,我可以补充说,我希望它能与glsl 3.30最高,因为它是我的图形卡可以集合(或至少它的支持版本报告)

创建顶点和索引 在构造函数中,我这样做是为了填充
\u顶点
\u索引

_vertices[0] = { {{-50.0f, -50.0f}}, {{1.0f, 0.0f, 0.0f, 1.0f}} };
_vertices[1] = { {{ 50.0f, -50.0f}}, {{0.0f, 1.0f, 0.0f, 1.0f}} };
_vertices[2] = { {{ 50.0f,  50.0f}}, {{0.0f, 0.0f, 1.0f, 1.0f}} };

_indices[0] = 0;
_indices[1] = 1;
_indices[2] = 2;
然而,我确实意识到,我确实在稍早的时候撒谎了,
\u索引[2]
实际上被设置到了不同的顶点。为什么它看起来是绿色的等等。当我纠正它时(根据上面的布局,我得到了一个紫色的三角形(在另一个角,因为错误的顶点实际上是组成四元体的第四个顶点,它的颜色是1,1,1,1(白色))。

我只是“愚蠢”。一直以来,一切都很好,我确实看到了一个插值图像,一切都是正确的,但我没有看到太多-_-

只是一点点,因为正交坐标系在两个轴上似乎都是[-1,1]。我画三角形时认为它是[-50,50](在两个轴上),所以我看到一个部分大小为插值三角形的50分之一

很抱歉把你的时间浪费在阅读上,感谢你努力帮助那些阅读的人

(也就是说,如果我画了一个适合视图端口的三角形,它就可以工作了)

我只是“愚蠢”。一直以来,一切都很好,我确实看到了一个插值图像,一切都是正确的,但我没有看到太多-_-

只是一点点,因为正交坐标系在两个轴上似乎都是[-1,1]。我画三角形时认为它是[-50,50](在两个轴上),所以我看到一个部分大小为插值三角形的50分之一

很抱歉浪费您的时间给任何人阅读,并感谢您尝试帮助体育
_vertices[0] = { {{-50.0f, -50.0f}}, {{1.0f, 0.0f, 0.0f, 1.0f}} };
_vertices[1] = { {{ 50.0f, -50.0f}}, {{0.0f, 1.0f, 0.0f, 1.0f}} };
_vertices[2] = { {{ 50.0f,  50.0f}}, {{0.0f, 0.0f, 1.0f, 1.0f}} };

_indices[0] = 0;
_indices[1] = 1;
_indices[2] = 2;