Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用细分着色器时,OpenGL GL_在GLDrawArray上的操作无效_C++_Opengl_Glsl - Fatal编程技术网

C++ 使用细分着色器时,OpenGL GL_在GLDrawArray上的操作无效

C++ 使用细分着色器时,OpenGL GL_在GLDrawArray上的操作无效,c++,opengl,glsl,C++,Opengl,Glsl,我正在关注OpenGL SuperBible第六版,我遇到了一个特殊的问题 我有以下代码呈现: const GLfloat color[] = { 0.0f, 0.2f, 0.0f, 1.0f }; //crtime += 0.01; glClearBufferfv(GL_COLOR, 0, color); checkError(); glUseProgram(program); checkError(); GLfloat attrib[]

我正在关注OpenGL SuperBible第六版,我遇到了一个特殊的问题

我有以下代码呈现:

    const GLfloat color[] = { 0.0f, 0.2f, 0.0f, 1.0f };
    //crtime += 0.01;
    glClearBufferfv(GL_COLOR, 0, color);
    checkError();
    glUseProgram(program);
    checkError();
    GLfloat attrib[] = { (float)sin(crtime) * 0.5f, (float)cos(crtime) * 0.6f, 0.0f, 0.0f };
    glVertexAttrib4fv(0, attrib);
    checkError();
    glDrawArrays(GL_TRIANGLES, 0, 3);
    checkError();
checkError()
是一个简单的函数,用于检查是否存在OpenGL错误,并在存在错误时为其打印
GlueErrorString

我的OpenGL程序由以下着色器组成:

vertex.glsl

#version 430 core

layout (location = 0) in vec4 offset;

void main(void) {
    const 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));
    gl_Position = vertices[gl_VertexID] + offset;
}
tessctrlshader.glsl

#version 430 core

layout (vertices = 3) out;

void main(void) {
    if(gl_InvocationID == 0) {
        gl_TessLevelInner[0] = 5.0;
        gl_TessLevelOuter[0] = 5.0;
        gl_TessLevelOuter[1] = 5.0;
        gl_TessLevelOuter[2] = 5.0;
    }
    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}
#version 430 core

layout (triangles) in;

void main(void) {
    gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position) + (gl_TessCoord.y * gl_in[1].gl_Position) + (gl_TessCoord.z * gl_in[2].gl_Position);
}
tessevalshader.glsl

#version 430 core

layout (vertices = 3) out;

void main(void) {
    if(gl_InvocationID == 0) {
        gl_TessLevelInner[0] = 5.0;
        gl_TessLevelOuter[0] = 5.0;
        gl_TessLevelOuter[1] = 5.0;
        gl_TessLevelOuter[2] = 5.0;
    }
    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}
#version 430 core

layout (triangles) in;

void main(void) {
    gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position) + (gl_TessCoord.y * gl_in[1].gl_Position) + (gl_TessCoord.z * gl_in[2].gl_Position);
}
fragment.glsl

#version 430 core

out vec4 color;

void main(void) { 
    color = vec4(0.0, 0.8, 1.0, 1.0);
}
以下是初始化代码(
LCAShader()
从文件加载并打印编译错误(如果有)


每次点击
glDrawArrays
,OpenGL都会抛出一个
GL\u INVALID\u操作
错误。但是,如果同时移除两个细分着色器,则不会发生这种情况。

我知道这是一个旧线程,但仍然没有答案。 在代码表单书中,作者使用
GL_三角形
参数调用
glDrawArrays

你需要做的是调用
glDrawArray(GL_补丁,0,3)在渲染函数中。

任何编译/链接日志输出?您是否查看了从DrawArray执行GL\u无效\u操作的可能情况?你看过调试输出了吗?@ratchetfreak:所有着色器编译时都没有警告或错误。@BartekBanachewicz我看过了。据我所知,这些案例都不适用于我的程序(每一个都检查过)。我还运行了一段代码,以查看生成的GLSL程序是否有效,这表明它是有效的。