gpt4 book ai didi

C++ OpenGL glCreateProgram 在 Windows 上返回 0

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:45 25 4
gpt4 key购买 nike

我正在使用 C++ 和 Visual Studio 学习 OpenGL,当我运行我的程序时,它会快速提示显示窗口然后崩溃,导致我进入一个断点,上面写着“OpenGL.exe 中 0x00000000 处未处理的异常:0xC000000005:访问违反。”。

这是我的代码:

#include <iostream>
#include <string>
#include <fstream>

#include <sdl2/SDL.h>
#include <gl/glew.h>

GLuint crearShader (const std :: string & texto, GLenum tipo);
std :: string cargarShader (const std :: string & nombreArchivo);
void comprobarErrorShader (GLuint shader, GLuint flag, bool esPrograma, const std :: string & mensaje);

void display ()
{
SDL_Init(SDL_INIT_EVERYTHING);

SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

SDL_Window * ventana = SDL_CreateWindow("OpenGL", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
640, 480, SDL_WINDOW_OPENGL);
SDL_GLContext contexto = SDL_GL_CreateContext(ventana);
GLenum estado = glewInit();

if (estado != GLEW_OK)
{
std :: cerr << "Fallo al inicializar Glew." << std :: endl;
exit(EXIT_FAILURE);
}

GLuint programa = glCreateProgram(); // <-- Problem goes here.
const unsigned int NUM_SHADERS = 2;
GLuint shaders[ NUM_SHADERS ];
shaders[0] = crearShader(cargarShader("./shaderBasico.vs"), GL_VERTEX_SHADER);
shaders[1] = crearShader(cargarShader("./shaderBasico.fs"), GL_FRAGMENT_SHADER);
unsigned int i;

for (i = 0; i < NUM_SHADERS; i++)
{
glAttachShader(programa, shaders[ i ]);
}

glLinkProgram(programa);
comprobarErrorShader(programa, GL_LINK_STATUS, true, "Error: Fallo al vincular el programa: ");

glValidateProgram(programa);
comprobarErrorShader(programa, GL_VALIDATE_STATUS, true, "Error: El programa es invalido: ");

SDL_Event evento;

do
{
glClearColor(0x00, 0x00, 0x00, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(programa);
SDL_GL_SwapWindow(ventana);
SDL_PollEvent(&evento);
}
while (evento.type != SDL_QUIT) ;

for (i = 0; i < NUM_SHADERS; i++)
{
glDetachShader(programa, shaders[ i ]);
glDeleteShader(shaders[ i ]);
}

glDeleteProgram(programa);
SDL_GL_DeleteContext(contexto);
SDL_DestroyWindow(ventana);
SDL_Quit();
}

GLuint crearShader (const std :: string & texto, GLenum tipo)
{
GLuint shader = glCreateShader(tipo);

if (shader == 0)
{
std :: cerr << "Error al crear shader." << std :: endl;
}

const GLchar * shaderSourceStrings[1] = {texto.c_str()};
GLint shaderSourceStringLengths[1] = {texto.length()};
glShaderSource(shader, 1, shaderSourceStrings, shaderSourceStringLengths);
glCompileShader(shader);

comprobarErrorShader(shader, GL_COMPILE_STATUS, true, "Error: Fallo al vincular el programa: ");

return shader;
}

std :: string cargarShader (const std :: string & nombreArchivo)
{
std :: ifstream archivo;
archivo.open(nombreArchivo.c_str());

std :: string salida;
std :: string linea;

if (archivo.is_open())
{
while (archivo.good())
{
getline(archivo, linea);
salida.append(linea + "\n");
}
}
else
{
std :: cerr << "Error, no se pudo cargar un shader." << std :: endl;
}

return salida;
}

void comprobarErrorShader (GLuint shader, GLuint flag, bool esPrograma, const std :: string & mensaje)
{
GLint exito = 0;
GLchar error[1024] = { 0 };

if (esPrograma)
{
glGetProgramiv(shader, flag, &exito);
}
else
{
glGetShaderiv(shader, flag, &exito);
}

if (exito == GL_FALSE)
{
if (esPrograma)
{
glGetProgramInfoLog(shader, sizeof error, NULL, error);
}
else
{
glGetShaderInfoLog(shader, sizeof error, NULL, error);
}

std :: cerr << mensaje << ": '" << error << "'" << std :: endl;
}
}

int main (int argc, char * argv[])
{
display();

return 0;
}

如您所见,我在创建程序之前初始化了 glew,但仍然出现错误,有什么想法吗?

最佳答案

glGetString(GL_VERSION) returns 1.4.0 - Build 8.14.10.2364

好吧,glCreateProgram() 不是 OpenGL 1.4 的核心。

GLEW 最有可能将 glCreateProgram() 设置为 NULL。

Check如果您的 GL 实现支持 ARB_vertex_shader , ARB_fragment_shader , 和 ARB_shader_objects并改用那些 ARB 函数。

如果这些扩展不受支持,那么除非您想使用像Mesa 这样的软件光栅器,否则您在着色器前端就是SOL。 .

关于C++ OpenGL glCreateProgram 在 Windows 上返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22187660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com