标签: vertex-attributes

将属性传递给OpenGL顶点着色器的行为很奇怪

问题:

结果1:我将一个顶点属性传递给着色器,程序运行5秒钟,然后图形驱动程序停止响应并恢复,但程序没有.

结果2:我将帧率限制在60,然后做同样的事情.程序运行正常,但是当我尝试在同一运行时传递顶点属性的不同值时,它不会更新几何体(只传递第一个顶点属性).

我正在使用带有GLSL 140的OpenGL 3.1版.(我的显卡/驱动程序支持最高)

我尝试过的:

互联网浏览和阅读教程.由于我不太了解OpenGL,我认为问题在于我只是不知道要搜索什么.

注意:对不起,如果我有一些不好的OpenGL编码习惯,我还在学习.

码:

opengl2_vert.glsl

#version 140

in vec4 offset;

void main(void)
{
    // Declare a hard-coded array of positions
    vec4 vertices[3] = vec4[3](vec4( 0.25, -0.25, 0.5, 1.0),
    vec4(-0.25, -0.25, 0.5, 1.0),
    vec4( 0.25, 0.25, 0.5, 1.0));
    // Index into our array using gl_VertexID
    gl_Position = vertices[gl_VertexID] - offset;
}
Run Code Online (Sandbox Code Playgroud)

Game.cpp

#include "Game.h"


void Game::init()
{
    GLuint vertex_shader = getIO().loadShader("opengl2_vert.glsl", ShaderType::VERTEX);
    GLuint fragment_shader = getIO().loadShader("opengl2_frag.glsl", ShaderType::FRAGMENT);

    // Create program, attach shaders to …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glsl vertex-shader vertex-attributes

3
推荐指数
1
解决办法
1454
查看次数

我可以有多个GL_ARRAY_BUFFER缓冲区吗?

所以我正在寻找关于命令glVertexAttribPointer的另一个SO问题,我遇到了一些轻微的混乱.这个问题的接受答案解释了,

但是当你进行调用时,还会有一个额外的隐含状态,它也会被存储为属性0:从当前绑定到GL_ARRAY_BUFFER的缓冲区中读取数据

这对我来说很有意义,但如果我有多个绑定的缓冲区GL_ARRAY_BUFFER呢?该glVertexAttribPointer()方法如何知道设置属性的方法?

例如,在我的代码中,我正在绘制一个渐变三角形.为此,我创建了2个VBO,一个是数组中的颜色数据,另一个是顶点位置.

glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    static const GLfloat points[] = {
    //data here
    };
    static const GLfloat colors[] = {
      //data here
    };
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    vs = glCreateShader(GL_VERTEX_SHADER);
    fs = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(vs, 1, &vertexShaderData, NULL);
    glShaderSource(fs, 1, &fragShaderData, NULL);
    glCompileShader(vs);
    glCompileShader(fs);
    sp=glCreateProgram();
    glBindFragDataLocation(sp, 0, "outColor");
    glAttachShader(sp, vs);
    glAttachShader(sp, fs);
    glLinkProgram(sp);
    glUseProgram(sp);
    glGenBuffers(1, &colorBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl vertex-buffer vertex-attributes vertex-array-object

3
推荐指数
1
解决办法
1027
查看次数

如何在glDrawElements中处理索引数据?

我知道当调用glDrawElements时,它使用索引缓冲区来确定以什么顺序绘制的顶点.我的问题是这些索引如何应用于纹理,法线和颜色属性.是否可以设置另一个索引数组,以确定每个顶点应使用哪个纹理坐标和法线.或者我是否必须创建法线和纹理坐标缓冲区,以便它们与正在绘制的顶点对齐?

opengl vertex-array vertex-attributes

1
推荐指数
1
解决办法
480
查看次数

在glVertexAttribPointer()中使用GL_INT_2_10_10_10_REV

谁能告诉我在glVertexAttribPointer()中我们如何使用GL_INT_2_10_10_10_REV作为类型参数呢?我试图使用此类型传递颜色值.此类型中"REV"后缀的含义是什么?是否需要在着色器中进行任何特殊处理?

我的代码如下:

GLuint red=1023,green=1023,blue=1023,alpha=3;

GLuint val = 0;
val = val | (alpha << 30);
val = val | (blue << 20);
val = val | (green << 10);
val = val | (red << 0);

GLuint test_data[]={val,val,val,val};

loadshaders();

glBindAttribLocation(ps,0,"tk_position");

glBindAttribLocation(ps,1,"color");

LinkShader();

glUseProgram(ps);

glEnableVertexAttribArray (0);

glVertexAttribPointer(0, 4, GL_FLOAT, 0, 0, vertices);

glEnableVertexAttribArray (1);

glVertexAttribPointer(1,GL_BGRA,GL_UNSIGNED_INT_2_10_10_10_REV,GL_TRUE,0,test_data);

glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
Run Code Online (Sandbox Code Playgroud)

着色器是:顶点着色器 -

#version 150

in vec4 tk_position;
in vec4 color;

out vec4 v_color;

void main()
{
    v_color = color;
    gl_Position = tk_position; 
} …
Run Code Online (Sandbox Code Playgroud)

opengl glsl vertex-attributes

1
推荐指数
1
解决办法
3977
查看次数