首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >随glDrawArrays一起出现的OpenGL错误1280

随glDrawArrays一起出现的OpenGL错误1280
EN

Stack Overflow用户
提问于 2018-08-22 01:33:21
回答 1查看 878关注 0票数 1

glDrawArrays()调用中出现OpenGL错误1280。当我在互联网上搜索时,我发现它可能是由无效的枚举引起的。

GL_ENUMs对我来说似乎没问题。另外,在调用绘图之前,我已经启用了着色器和顶点数组。

屏幕上什么都不会画出来。

main.cpp:

代码语言:javascript
运行
复制
#include"reader.h"
#include"window.h"
#include"shader.h"
int main() {

float vertices[] = {
    -0.5f, -0.5f, 0.0f ,
    0.5f, -0.5f, 0.0f , 
    0.0f,  0.5f, 0.0f 
};

Window window;

GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

Shader shader;
shader.addShader("./src/shaders/basic.vtx",GL_VERTEX_SHADER);
shader.addShader("./src/shaders/basic.frg", GL_FRAGMENT_SHADER);
shader.compile();
shader.enable();


GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices,GL_STATIC_DRAW);

GLint pos_in = glGetAttribLocation(shader.getProgram(), "pos_in");
if (pos_in < 0) {
    std::cout << "pos_in not found\n";
}
glVertexAttribPointer(pos_in, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *)0);
glEnableVertexAttribArray(pos_in);


while (!window.closed()) {
    window.update();
    glDrawArrays(GL_TRIANGLES,0,3);
}
return 0;
}

shader.h:

代码语言:javascript
运行
复制
#pragma once
#include<glad/glad.h>
#include<iostream>
#include<vector>
#include"reader.h"

class Shader {
std::vector<GLuint> shaders;
GLuint program;

public :

GLuint& getProgram() { 
    return program; 
}

Shader() {
    program = glCreateProgram();
}
void addShader(const char * path, GLenum type) {

    std::string data = ShaderReader(path).read_shader();
    const char * chardata = data.c_str();
    GLuint shader = glCreateShader(type);
    glShaderSource(shader, 1, &chardata , nullptr);
    glCompileShader(shader);

    int success;
    char buffer[512];
    glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
    if (!success) {
        glGetShaderInfoLog(shader, 512, NULL, buffer);
        std::cout << buffer << std::endl;
        return;
    }
    std::cout << "shader inserted into vector\n";

    shaders.push_back(shader);
}

void compile(){
    for (int i = 0; i != shaders.size();i++) {
        glAttachShader(program, shaders[i]);
    }
    glLinkProgram(program);
    glValidateProgram(program);
    glUseProgram(program);
    int status;
    glGetProgramiv(program, GL_COMPILE_STATUS, &status);

    char buffer[512];
    if (!status) {
        glGetProgramInfoLog(program,512,NULL,buffer);
        std::cout << buffer << std::endl;
        return;
    }
    std::cout << "shader compilation successful\n";
}
void enable() {
    glUseProgram(program);
}
void disable() {
    glUseProgram(0);
}
~Shader() {
    for (int i = 0; i != shaders.size();i++) {
        glDeleteShader(shaders[i]);
    }
}

};

顶点着色器:

代码语言:javascript
运行
复制
#version 400 

layout (location = 0 ) in vec3 pos_in ;

void main(){
gl_Position = vec4(pos_in.x , pos_in.y , pos_in.z , 1.0f);  
}

片段着色器:

代码语言:javascript
运行
复制
#version 400

out vec4 color;

void main(){
color = vec4(0.0f, 0.5f , 0.5f , 1.0f);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-22 01:45:19

glGetProgramiv中出现GL_INVALID_ENUM错误,其中第二个参数必须为GL_LINK_STATUS而不是GL_COMPILE_STATUS

代码语言:javascript
运行
复制
glGetProgramiv(program, GL_LINK_STATUS, &status);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51953940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档