问题:
结果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) 所以我正在寻找关于命令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
我知道当调用glDrawElements时,它使用索引缓冲区来确定以什么顺序绘制的顶点.我的问题是这些索引如何应用于纹理,法线和颜色属性.是否可以设置另一个索引数组,以确定每个顶点应使用哪个纹理坐标和法线.或者我是否必须创建法线和纹理坐标缓冲区,以便它们与正在绘制的顶点对齐?
谁能告诉我在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)