我试图寻找可以在OpenGL中使用Sync Objects的场景.我的理解是,一旦放入GL命令流(使用glFenceSync())的同步对象将在执行并实现所有GL命令后发出信号.如果同步对象是同步原语,为什么我们不能手动发信号呢?这个功能究竟在哪里可以帮助GL程序员?
以下方案是否正确?
Thread 1 :
Load model
Draw()
glFenceSync()
Thread 2 :
glWaitSync();
ReadPixels
Use data for subsequent operation.
Run Code Online (Sandbox Code Playgroud)
这是否意味着除非在线程1中调用glFenceSync(),否则我无法启动线程2?
我的顶点着色器是,
uniform Block1{ vec4 offset_x1; vec4 offset_x2;}block1;
out float value;
in vec4 position;
void main()
{
value = block1.offset_x1.x + block1.offset_x2.x;
gl_Position = position;
}
Run Code Online (Sandbox Code Playgroud)
我用来传递值的代码是:
GLfloat color_values[8];// contains valid values
glGenBuffers(1,&buffer_object);
glBindBuffer(GL_UNIFORM_BUFFER,buffer_object);
glBufferData(GL_UNIFORM_BUFFER,sizeof(color_values),color_values,GL_STATIC_DRAW);
glUniformBlockBinding(psId,blockIndex,0);
glBindBufferRange(GL_UNIFORM_BUFFER,0,buffer_object,0,16);
glBindBufferRange(GL_UNIFORM_BUFFER,0,buffer_object,16,16);
Run Code Online (Sandbox Code Playgroud)
我期待的是,为每个vec4制服传递16个字节.对于offset = 16,size = 16,我得到GL_INVALID_VALUE错误.我对偏移值感到困惑.Spec说它对应于"buffer_object".
谁能告诉我在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)