最近我开始学习OpenGL和; 反过来,开始阅读使用OpenGL 4.3的OpenGL SuperBible第6版.
我的问题出现在sb6.h头文件中,因为在本书中写道,这是一个c ++头文件,它定义了一个名为sb6的命名空间,它包含了一个应用程序类的声明.
当我尝试编译我的程序时,我的C++ IDE(Visual Studio 2010)会抛出一个错误,指出无法找到这样的头文件.
所以也许你们其中一个人听说过这个问题,或者也开始阅读这本书并知道如何解决这个问题; 如果是的话请回复.
#include "sb6.h"
//derive my_application from sb6:application
class my_application : public sb6.application
{
public :
//Rendering function
void render(double currentTime){
//Simply clear the window red
static const GLfloat red[] = {1.0f , 0.0f , 0.0f , 1.0f};
glClearBufferfv(GL_COLOR, 0 , red) ;
}
Run Code Online (Sandbox Code Playgroud) 我想渲染围绕一组点的动态变化半径的实心圆,其2D坐标存储在VBO中.到目前为止,我使用的是GL_POINT_SMOOTH,但现在已转移到OpenGL 4.0,此选项不再可用.我在这里看到了类似的问题,但这并不适合我的需要,因为该示例中圆圈的中心在片段着色器中是硬编码的.我该怎么做?
目前,我的顶点着色器看起来像这样:
#version 400
layout(location=0) in vec2 in_Position;
layout(location=1) in vec4 in_Color;
out vec4 ex_Color;
uniform vec4 bounds;
void main(void){
float x = -1+2/(bounds.y-bounds.x)*(in_Position.x-bounds.x);
float y = -1+2/(bounds.w-bounds.z)*(in_Position.y-bounds.z);
gl_Position = vec4(x,y,0,1);
ex_Color = in_Color;
}
Run Code Online (Sandbox Code Playgroud)
我的片段着色器看起来像这样:
#version 400
in vec4 ex_Color;
out vec4 out_Color;
void main(void){
out_Color = ex_Color;
}
Run Code Online (Sandbox Code Playgroud)
使用这些着色器,我得到了平方点.
是否可以将 3D RGBA32F 纹理作为与 imageAtomic 操作(即 R32F)兼容的类型传递给着色器,然后以某种方式修改 ivec3 索引,以便确定性地访问 RGBA32F 纹理的适当组件?
我知道这对于索引更直接的缓冲区是可能的,但 ivec3 似乎会阻止巧妙的索引操作。
我正在使用OpenGL 4.2,我无法弄清楚为什么我在这个程序中收到GL_INVALID_VALUE错误.当我调用glBindAttribLocation时出错.根据OpenGL 4参考页面,只有两个原因可以从glBindAttribLocation生成GL_INVALID_VALUE.
void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
正如你可以从下面的程序看,条件1不设置,因为indexIS 20和GL_MAX_VERTEX_ATTRIBS是34921.不满足条件2,因为program是由OpenGL使用生成的glCreateProgram().那我怎么可能得到一个GL_INVALID_VALUE错误?
// test.cpp
#include <GL/glew.h>
#include <GL/glut.h>
#include <iostream>
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutCreateWindow("Test");
glewInit();
std::cout << "Max Vertex Attributes : " << GL_MAX_VERTEX_ATTRIBS << std::endl;
// create program
GLuint program = glCreateProgram();
if ( program == 0 )
std::cout << "Program error" << std::endl;
// clear …Run Code Online (Sandbox Code Playgroud) 它们都可以用来获取以纳秒为单位的流逝时间。前者使用作用域 glBeginQuery/glEndQuery。这就是区别吗?
创建时,VAO 是否仅跟踪 VBO 索引(通过glBindVertexBuffer),或者还跟踪哪些 VBO 名称绑定到这些索引?如果我使用glVertexAttribBinding指定绑定索引,例如 0,我可以在绘制调用之前将不同的 VBO 绑定到索引 0 并让它使用该 VBO 的内容,还是始终使用任何 VBO创建 VAO 时是否绑定到索引 0?
我问这个问题是因为我发现很多例子都在调用glVertexAttribFormat和glVertexAttribBinding之前调用glBindVertexBuffer,如果 VAO 仅跟踪索引(因为绑定索引在 中给出),则不需要调用glVertexAttribBinding。
根据NVIDIA OpenGL 4.5 Update演示文稿的幻灯片23,以下内容如下:
非DSA:glGenBuffers + glBindBuffer
DSA:glCreateBuffers
我尝试过编写DSA程序.在使用glDrawArraysIndirect画,我被迫使用glBindBuffer沿glCreateBuffers
这是工作代码的片段:
glCreateBuffers(1, &bufObj);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, bufObj); //If deleted creates SEGFAULT crash
glNamedBufferData(bufObj, sizeof(mydrawcall), mydrawcall, GL_STATIC_DRAW);
...
glDrawArraysIndirect(GL_TRIANGLES, 0);
Run Code Online (Sandbox Code Playgroud)
glBindBuffer无DSA?我不确定哪种结构布局最适合我的应用程序:shared、packed、std140、std430。我并不是要对每一个进行解释,这些信息很容易找到,只是很难弄清楚每个对供应商兼容性/性能的影响。如果shared是默认值,我怀疑这是一个很好的起点。
据我所知,我必须在使用sharedor时查询对齐/偏移量packed,因为它是特定于实现的。
用于查询它的 API 是什么?glGetShaderiv在绑定计算着色器时,我是否传递了一些参数,让我找出对齐方式?
当您在着色器中指定“location = x”以指定着色器存储或统一缓冲区绑定点时,该数字可以是任何值吗?该绑定点是否独立于当前绑定的着色器?
是否可以在绑定着色器之前绑定所有 ubos 和 ssbo,只要着色器使用的每种类型缓冲区的数量 <= OpenGL 允许同时在着色器中使用的最大数量?
我可以绑定 20 个缓冲区,然后通过在着色器中指定绑定点索引来指定着色器当前正在使用哪些缓冲区吗?