Сбой связывания вершинного шейдера при работе с EGL - PullRequest
0 голосов
/ 06 апреля 2019

Я использую очень простую программу вершинного шейдера в своем приложении; он компилируется и связывается нормально, когда я использую библиотеку GLEW или GLUT. Но мне нужно работать без X11, поэтому я пытаюсь использовать его с библиотекой EGL, и ссылка завершается ошибкой:

ошибка: вершинному шейдеру не хватает `main '

#include <string.h>
#include <stdio.h>
#include <EGL/egl.h>
#define GL_GLEXT_PROTOTYPES 1
#include <GL/glut.h>
#include <GL/glext.h>

static const EGLint configAttribs[] = {
    EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
    EGL_BLUE_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_RED_SIZE, 8,
    EGL_DEPTH_SIZE, 8,
    EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
    EGL_NONE
};    
static const EGLint pbufferAttribs[] = {
  EGL_WIDTH, 100,
  EGL_HEIGHT, 100,
  EGL_NONE,
};
int main(int argc, char *argv[])
{
  // 1. Initialize EGL
  EGLDisplay eglDpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
  EGLint major, minor;
  eglInitialize(eglDpy, &major, &minor);
  // 2. Select an appropriate configuration
  EGLint numConfigs;
  EGLConfig eglCfg;
  eglChooseConfig(eglDpy, configAttribs, &eglCfg, 1, &numConfigs);
  // 3. Create a surface
  EGLSurface eglSurf = eglCreatePbufferSurface(eglDpy, eglCfg, 
                                           pbufferAttribs);
  // 4. Bind the API
  eglBindAPI(EGL_OPENGL_API);
  // 5. Create a context and make it current
  EGLContext eglCtx = eglCreateContext(eglDpy, eglCfg, EGL_NO_CONTEXT, 
                                   NULL);
  eglMakeCurrent(eglDpy, eglSurf, eglSurf, eglCtx);
  // from now on use your OpenGL context
  int len;
  GLint res = GL_FALSE;
  GLuint VertexShaderID = glCreateShader (GL_VERTEX_SHADER);
  const char * VertexShaderCode = 
"#version 330 core\n"
"\n"
"layout(location = 0) in vec3 vertexPosition_modelspace;\n"
"layout(location = 1) in vec4 vertexColor;\n"
"\n"
"out vec4 fragmentColor;\n"
"uniform mat4 MVP;\n"
"\n"
"void main(){\n"
"\n"
"        gl_Position =  MVP * vec4(vertexPosition_modelspace,1);\n"
"\n"
"        fragmentColor.r = vertexColor.r;\n"
"        fragmentColor.g = vertexColor.g;\n"
"        fragmentColor.b = vertexColor.b;\n"
"        fragmentColor.a = vertexColor.a;\n"
"}\n";
  // Compile Vertex Shader
  glShaderSource (VertexShaderID, 1, &VertexShaderCode , NULL);
  glCompileShader (VertexShaderID);
  glGetShaderiv (VertexShaderID, GL_COMPILE_STATUS, &res);
  glGetShaderiv (VertexShaderID, GL_INFO_LOG_LENGTH, &len);
  if (len > 0)
    {
      char mess[len+1];
      glGetShaderInfoLog (VertexShaderID, len, NULL, &mess[0]);
      printf("%s\n", mess);
    }
  // Link the program
  GLuint ProgramID = glCreateProgram ();
  glAttachShader (ProgramID, VertexShaderID);
  glLinkProgram (ProgramID);
  // Check the program
  glGetProgramiv (ProgramID, GL_LINK_STATUS, &res);
  glGetProgramiv (ProgramID, GL_INFO_LOG_LENGTH, &len);
  if (len > 0)
    {
      char mess[len+1];
      glGetProgramInfoLog (ProgramID, len, NULL, &mess[0]);
      printf("%s\n", mess);
    }
  glDetachShader (ProgramID, VertexShaderID);
  glDeleteShader (VertexShaderID);
  // 6. Terminate EGL when finished
  eglTerminate(eglDpy);
  return 0;
}

Вероятно, я забыл какой-то параметр конфигурации EGL.

...