使用SDL2和Glew,尝试在OpenGL中绘制一个简单的白色正方形。只是黑屏

g

基于此处的教程:http//lazyfoo.net/tutorials/SDL/51_SDL_and_modern_opengl/index.php

但是运气不好。有任何想法吗?这是代码:

#include <stdio.h>
#include <SDL2/SDL.h>
#include "glew.h"
//#include <GL/glut.h>
#include <SDL2/SDL_opengl.h>
#include <stdbool.h>

void close(GLuint gProgramID, SDL_Window *window);
bool initGL(GLuint *gProgramID, GLint *gVertexPos2DLocation, GLuint *gVBO, GLuint *gIBO);
void printProgramLog(GLuint program);
void printShaderLog(GLuint shader);
void render(GLuint *gProgramID, GLint *gVertexPos2DLocation, GLuint *gVBO, GLuint *gIBO);


void close(GLuint gProgramID, SDL_Window *window) {
  //Deallocate program
  glDeleteProgram( gProgramID );

  //Destroy window  
  SDL_DestroyWindow( window );
  window = NULL;

  //Quit SDL subsystems
  SDL_Quit();
}

bool initGL(GLuint *gProgramID, GLint *gVertexPos2DLocation, GLuint *gVBO, GLuint *gIBO) {
  *gProgramID = glCreateProgram();

  GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);

  const GLchar *vertexShaderSource[] =
  {
    "#version 140\nin vec2 LVertexPos2D; void main() { gl_Position = vec4( LVertexPos2D.x, LVertexPos2D.y, 0, 1 ); }"
  };

  glShaderSource(vertexShader, 1, vertexShaderSource, NULL);

  glCompileShader(vertexShader);

  GLint vShaderCompiled = GL_FALSE;
  glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &vShaderCompiled);

  if (vShaderCompiled != GL_TRUE) {
    printf("Unable to compile shader %d", &vShaderCompiled);
    printShaderLog(vertexShader);

    return false;
  }
  else {
    glAttachShader(*gProgramID, vertexShader);
    GLuint fragmentShader = glCreateShader( GL_FRAGMENT_SHADER );

    const GLchar *fragmentShaderSource[] =
    {
        "#version 140\nout vec4 LFragment; void main() { LFragment = vec4( 1.0, 1.0, 1.0, 1.0 );}"
    };

    glShaderSource(fragmentShader, 1, fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);

    GLint fShaderCompiled = GL_FALSE;
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &fShaderCompiled);
    if(fShaderCompiled != GL_TRUE) {
        printf("Unable to compile fragment shader %d!\n", fragmentShader);
        printShaderLog(fragmentShader);
        return false;
    }
    else {
      glAttachShader(*gProgramID, fragmentShader);

      glLinkProgram(*gProgramID);

      GLint programSuccess = GL_TRUE;
      glGetProgramiv(*gProgramID, GL_LINK_STATUS, &programSuccess);
      if (programSuccess != GL_TRUE) {
        printf("Error linking program %d!\n", *gProgramID);
        printProgramLog(*gProgramID);
        return false;
      }
      else {
        *gVertexPos2DLocation = glGetAttribLocation(*gProgramID, "LVertexPos2D");

        if (*gVertexPos2DLocation == -1) {
          printf("LVertexPos2D is not a valid glsl program variable!\n");
          return false;
        }
        else {
          glClearColor(0.f, 0.f, 0.f, 1.f);

          GLfloat vertexData[] = {
            -0.5f, -0.5f,
            0.5f, -0.5f,
            0.5f, 0.5f,
            -0.5f, 0.5f
          };

          GLuint indexData[] = { 0, 1, 2, 3 };

          glGenBuffers(1, gVBO);
          glBindBuffer(GL_ARRAY_BUFFER, *gVBO);
          glBufferData(GL_ARRAY_BUFFER, 2 * 4 * sizeof(GLfloat), vertexData, GL_STATIC_DRAW);

          glGenBuffers(1, gIBO);
          glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *gIBO);
          glBufferData(GL_ELEMENT_ARRAY_BUFFER, 4 * sizeof(GLuint), indexData, GL_STATIC_DRAW);
          return true;
        }
      }
    }
  }
}

void printProgramLog(GLuint program) {
  if (glIsProgram(program)) {

    int infoLogLength = 0;
    int maxLength = infoLogLength;

    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);

    char* infoLog = malloc(sizeof(char) * maxLength);

    glGetProgramInfoLog(program, maxLength, &infoLogLength, infoLog);
    if (infoLogLength > 0) {
      printf("%s\n", infoLog);
    }

    free(infoLog);
  }
  else {
    printf( "Name %d is not a program\n", program );
  }
}

void printShaderLog(GLuint shader) {
  //Make sure name is shader
  if(glIsShader( shader )) {
    //Shader log length
    int infoLogLength = 0;
    int maxLength = infoLogLength;

    //Get info string length
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);

    //Allocate string
    char* infoLog = malloc(sizeof(char) * maxLength);

    //Get info log
    glGetShaderInfoLog(shader, maxLength, &infoLogLength, infoLog);
    if(infoLogLength > 0) {
        printf( "%s\n", infoLog );
    }

    //Deallocate string
    free(infoLog);
  }
  else {
    printf("Name %d is not a shader\n", shader);
  }
}

void render(GLuint *gProgramID, GLint *gVertexPos2DLocation, GLuint *gVBO, GLuint *gIBO) {
  //Clear color buffer
  glClear(GL_COLOR_BUFFER_BIT);

  //Bind program
  glUseProgram(*gProgramID);

  //Enable vertex position
  glEnableVertexAttribArray(*gVertexPos2DLocation);

  //Set vertex data
  glBindBuffer(GL_ARRAY_BUFFER, *gVBO);
  glVertexAttribPointer(*gVertexPos2DLocation, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), NULL);

  //Set index data and render
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *gIBO);
  glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_INT, NULL);

  //Disable vertex position
  glDisableVertexAttribArray(*gVertexPos2DLocation);

  //Unbind program
  glUseProgram(NULL);
}

int main(int argc, char *argv[]) {
  if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
    printf("SDL_Init error: %s\n", SDL_GetError());
  }

  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

  SDL_Window *window = SDL_CreateWindow("Pong", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_OPENGL);

  GLuint gProgramID = 0;
  GLint gVertexPos2DLocation = -1;
  GLuint gVBO = 0;
  GLuint gIBO = 0;

  SDL_GLContext *context = SDL_GL_CreateContext(window);

  if (context == NULL) {
    printf("OpenGL context could not be created! SDL Error: %s\n", SDL_GetError());
    return 1;
  }

  glewExperimental = GL_TRUE;
  GLenum glewError = glewInit();

  if (glewError != GLEW_OK) {
    printf("Error initializing glew! %s\n", glewGetErrorString(glewError));
    return 1;
  }

  if( SDL_GL_SetSwapInterval( 1 ) < 0 ) {
    printf( "Warning: Unable to set VSync! SDL Error: %s\n", SDL_GetError() );
  }

  //Initialize OpenGL
  if (!initGL(&gProgramID, &gVertexPos2DLocation, &gVBO, &gIBO)) {
    printf( "Unable to initialize OpenGL!\n" );
    return 1;
  }

  bool quit = false;

  SDL_Event e;

  while (!quit) {
    while (SDL_PollEvent(&e) != 0) {
      if (e.type == SDL_QUIT) {
        quit = true;
      }

      if (e.type == SDL_KEYDOWN) {
        SDL_Keycode keyPressed = e.key.keysym.sym;

        switch (keyPressed) {
          case SDLK_ESCAPE:
            quit = true;
            break;
        }
      }
    }

    render(&gProgramID, &gVertexPos2DLocation, &gVBO, &gIBO);

    SDL_GL_SwapWindow(window);
  }

  SDL_StopTextInput();
  close(gProgramID, window);

  return 0;
}

您正在使用的教程存在一些怪异的缺陷:

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

这需要OpenGL 3.1核心配置文件上下文,因为GL 3.2中引入了配置文件,所以这根本没有意义。没有3.1核心配置文件根据WGL_ARB_create_context_specification,现在可以发生以下情况:

如果请求版本3.1,则返回的上下文可以实现以下任何版本:

  • 版本3.1。GL_ARB_compatibility扩展可能会实现,也可能不会实现,具体取决于实现。
  • 3.2版或更高版本的核心配置文件。

因此,您很有可能会获得一些没有兼容性功能的现代环境,这将我们带到了第二个缺陷:您没有使用“顶点数组对象”(VAO)这些在现代OpenGL中必需的您使用的教程可能会在一些机器上偶然运行,其中GL实现返回带有兼容性扩展的GL 3.1上下文,但绝不能保证它能正常工作。

我建议你使用更精确的教程,就像学习现代3D图形编程open.gl尽管使用的窗口和上下文创建库对于学习OpenGL并不是很重要,但后者也有关于使用SDL2章节

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用SDL2和Glew,尝试在OpenGL中绘制一个简单的白色正方形。只是黑屏

来自分类Dev

错误的转换在OpenGL ES 2(iOS)上渲染一个简单的正方形

来自分类Dev

尝试通过PyOpengl使用索引和顶点绘制简单的正方形

来自分类Dev

使用VAO和VBO在3.2中绘制OpenGL线条和正方形

来自分类Dev

在OpenGL ES中绘制正方形

来自分类Dev

OpenGL仅渲染一个黑色正方形

来自分类Dev

在gnuplot中从x到y坐标绘制一个正方形

来自分类Dev

Java 在同一个 JFrame 中绘制多个正方形

来自分类Dev

在JS中以最小的时间复杂度绘制一个带边框的正方形

来自分类Dev

2d numpy数组中的平方和(4个值构成一个正方形)。蟒蛇

来自分类Dev

QPixmap复制一个正方形的内容绘制到另一个图像中

来自分类Dev

使用循环打印一个空的正方形

来自分类Dev

使用循环打印一个空的正方形

来自分类Dev

如何使用SDL 2.0绘制正方形?

来自分类Dev

如何使用SDL 2.0绘制正方形?

来自分类Dev

需要绘制/设置一个小的正方形背景图像,然后在x和y上重复

来自分类Dev

在Opengl中从不同颜色的正方形绘制矩形

来自分类Dev

如何使用OpenGL在中心的按钮上绘制正方形?

来自分类Dev

我正在尝试创建一个创建正方形的类,并且可以在我的主函数中调用它

来自分类Dev

openGL(c)绘制正方形

来自分类Dev

openGL(c)绘制正方形

来自分类Dev

C#,Windows 应用程序,绘制一个边为 N 的正方形

来自分类Dev

创建一个简单正方形的折叠动画

来自分类Dev

OpenGL ES在Android上画一个正方形

来自分类Dev

组成一个4个正方形的正方形

来自分类Dev

SDL文本输入返回白色正方形

来自分类Dev

SDL2和GLEW,如果使用SDL_GL_SetAttribute(),则无法获得正确的OpenGL版本

来自分类Dev

问:在python中创建一个程序,以显示指定数字范围的正方形和立方体表

来自分类Dev

根据直线的2个点计算一个正方形的4个点

Related 相关文章

  1. 1

    使用SDL2和Glew,尝试在OpenGL中绘制一个简单的白色正方形。只是黑屏

  2. 2

    错误的转换在OpenGL ES 2(iOS)上渲染一个简单的正方形

  3. 3

    尝试通过PyOpengl使用索引和顶点绘制简单的正方形

  4. 4

    使用VAO和VBO在3.2中绘制OpenGL线条和正方形

  5. 5

    在OpenGL ES中绘制正方形

  6. 6

    OpenGL仅渲染一个黑色正方形

  7. 7

    在gnuplot中从x到y坐标绘制一个正方形

  8. 8

    Java 在同一个 JFrame 中绘制多个正方形

  9. 9

    在JS中以最小的时间复杂度绘制一个带边框的正方形

  10. 10

    2d numpy数组中的平方和(4个值构成一个正方形)。蟒蛇

  11. 11

    QPixmap复制一个正方形的内容绘制到另一个图像中

  12. 12

    使用循环打印一个空的正方形

  13. 13

    使用循环打印一个空的正方形

  14. 14

    如何使用SDL 2.0绘制正方形?

  15. 15

    如何使用SDL 2.0绘制正方形?

  16. 16

    需要绘制/设置一个小的正方形背景图像,然后在x和y上重复

  17. 17

    在Opengl中从不同颜色的正方形绘制矩形

  18. 18

    如何使用OpenGL在中心的按钮上绘制正方形?

  19. 19

    我正在尝试创建一个创建正方形的类,并且可以在我的主函数中调用它

  20. 20

    openGL(c)绘制正方形

  21. 21

    openGL(c)绘制正方形

  22. 22

    C#,Windows 应用程序,绘制一个边为 N 的正方形

  23. 23

    创建一个简单正方形的折叠动画

  24. 24

    OpenGL ES在Android上画一个正方形

  25. 25

    组成一个4个正方形的正方形

  26. 26

    SDL文本输入返回白色正方形

  27. 27

    SDL2和GLEW,如果使用SDL_GL_SetAttribute(),则无法获得正确的OpenGL版本

  28. 28

    问:在python中创建一个程序,以显示指定数字范围的正方形和立方体表

  29. 29

    根据直线的2个点计算一个正方形的4个点

热门标签

归档