Проблема с шейдерами OpenGL - PullRequest
0 голосов
/ 15 ноября 2018

Мне нужна помощь с кодом OpenGL, который я пытаюсь создать.По сути, я пытаюсь создать треугольник зеленого цвета.

Ниже приведена среда, ошибка и код.Может кто-нибудь, пожалуйста, помогите?

Конвертер: Mac OS: High Sierra Видео: Intel HD Graphics 4000 1536 МБ графика

Сообщение об ошибке:

2018-11-14 20: 25: 46.416648-0800 GLFW opengl [41517: 6223602] MessageTracer: load_domain_whitelist_search_tree: 73: Номер версии формата файла дерева поиска (0) не поддерживается
2018-11-14 20: 25: 46.416773-0800 GLFW opengl [41517: 6223602] MessageTracer: Откат к белому списку по умолчанию
ИНФОРМАЦИЯ: OpenGL Версия: 2.1 INTEL-10.36.19 / n
ОШИБКА: 0: 1: '': Неверная директива: версия440
ОШИБКА: 0: 2: '(': синтаксическая ошибка: синтаксическая ошибка

код:

#include <stdio.h>
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>
#include <stdlib.h>
#include <string.h>

#include <string>
#include <sstream>
#include <iostream>
#include "glew.h"
#include "freeglut.h" // Include the freeGLUT header file

using namespace std;

#define WINDOW_TITLE "Modern OpenGL"

#ifndef GLSL
#define GLSL(Version, source) "#version" #Version "\n" #source
#endif

int WindowWidth = 800, WindowHeight = 600;

void UInitialize(int,char*[]);
void UInitWindow(int,char*[]);
void UResizeWindow(int,int);
void URenderGraphics(void);
void UCreateVBO(void);
void UCreateShaders(void);

const GLchar * VertexShader = GLSL(440,
    in layout(location=0) vec4 vertex_Postion;
        void main(){
            gl_Postion = vertex_Postion;
        }
);

const GLchar * FragmentShader = GLSL(440,
    void main(){
        gl_FragColor = vec4(0.0f,1.0f,0.0f,1.0f);
    }
);


int main(int argc, char* argv[]){
    UInitialize(argc, argv);
    glutMainLoop();
    exit(EXIT_SUCCESS);
}

void UInitialize(int argc, char* argv[]){
    GLenum GlewInitResult;
    UInitWindow(argc, argv);
    GlewInitResult = glewInit();
    if (GLEW_OK != GlewInitResult) {
        fprintf(stderr,"ERROR:%s/n",glewGetErrorString(GlewInitResult));
    }
    fprintf(stdout, "INFO: OpenGL Version: %s/n",glGetString(GL_VERSION));
    UCreateVBO();
    UCreateShaders();
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}

void UInitWindow(int argc, char* argv[]){

    glutInit(&argc,argv);
    glutInitWindowSize(WindowWidth, WindowHeight);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutCreateWindow(WINDOW_TITLE);
    glutReshapeFunc(UResizeWindow);
    glutDisplayFunc(URenderGraphics);

}

void UResizeWindow(int width, int height){
    glViewport(0, 0, width, height);
}
void URenderGraphics(void){

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    GLuint totalVertices = 3;
    //creates tirangle
    glDrawArrays(GL_TRIANGLES, 0, totalVertices);
    glutSwapBuffers();
}
void UCreateVBO(void){
    GLfloat verts[]={
      0.0f,1.0f,
      -1.0f,-1.0f,
        1.0f,-1.0f
    };
    float numVertices = sizeof(verts);
    GLuint myBufferID;
    glGenBuffers(1,&myBufferID);
    glBindBuffer(GL_ARRAY_BUFFER,myBufferID);
    glBufferData(GL_ARRAY_BUFFER,numVertices,verts,GL_STATIC_DRAW);
    GLuint floatsPerVertex = 2;
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0,floatsPerVertex,GL_FLOAT,GL_FALSE,0,0);
}

void UCreateShaders(void){
    GLuint ProgramId = glCreateProgram();

    GLuint vertexShaderId = glCreateShader(GL_VERTEX_SHADER);
    GLuint fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(vertexShaderId,1,&VertexShader,NULL);
    glShaderSource(fragmentShaderId,1,&FragmentShader,NULL);

    glCompileShader(vertexShaderId);
    glCompileShader(fragmentShaderId);

    GLint isCompiled = 0;
    glGetShaderiv(fragmentShaderId, GL_COMPILE_STATUS, &isCompiled);
    char *infoLog;
    int infologLength = 0;
    int charsWritten  = 0;
    if(isCompiled == GL_FALSE)
    {
        glGetShaderiv(vertexShaderId, GL_INFO_LOG_LENGTH, &infologLength);

        if (infologLength > 0)
        {
            infoLog = (char *)malloc(infologLength);
            glGetShaderInfoLog(vertexShaderId, infologLength, &charsWritten, infoLog);
            printf("\n%s\n",infoLog);
            free(infoLog);
        }

        // Provide the infolog in whatever manor you deem best.
        // Exit with failure.
        glDeleteShader(vertexShaderId); // Don't leak the shader.
        return;
    }
    fprintf(stdout, "OK!!!!!!!!!");
    glAttachShader(ProgramId,vertexShaderId);
    glAttachShader(ProgramId,fragmentShaderId);

    glLinkProgram(ProgramId);
    glUseProgram(ProgramId);
}

1 Ответ

0 голосов
/ 15 ноября 2018

Прочитайте сообщение об ошибке:

ОШИБКА: 0: 1: '': недопустимая директива: версия440
ОШИБКА: 0: 2: '(': синтаксическая ошибка: синтаксическая ошибка

это вызвано тем, что первая строка в вашем коде шейдера:

#version440

но правильный синтаксис будет #version 440.

Эта строка автоматически генерируется макросом GLSL. Вы должны вставить пробел в конце "#version", поэтому оно должно быть:

#ifndef GLSL
#define GLSL(Version, source) "#version " #Version "\n" #source
#endif

В вашей программе вершинного шейдера есть опечатка. Это должно быть gl_Position вместо gl_Postion.

Вы должны проверить состояние компиляции вершинного шейдера и фрагментного шейдера отдельно:

GLint isCompiled = 0;

glCompileShader(vertexShaderId);
glGetShaderiv(vertexShaderId, GL_COMPILE_STATUS, &isCompiled);
if ( isCompiled == GL_FALSE )
{
    GLint infologLength;
    glGetShaderiv(vertexShaderId, GL_INFO_LOG_LENGTH, &infologLength);
    std::vector< char >infoLog(infologLength);
    GLsizei charsWritten;
    glGetShaderInfoLog(vertexShaderId, infologLength, &charsWritten, infoLog.data());
    std::cout << "compile error:" << std::endl << infoLog.data() << std::endl;
    // .....
}

glCompileShader(fragmentShaderId);
glGetShaderiv(fragmentShaderId, GL_COMPILE_STATUS, &isCompiled);
if ( isCompiled == GL_FALSE )
{
    GLint infologLength;
    glGetShaderiv(fragmentShaderId, GL_INFO_LOG_LENGTH, &infologLength);
    std::vector< char >infoLog(infologLength);
    GLsizei charsWritten;
    glGetShaderInfoLog(fragmentShaderId, infologLength, &charsWritten, infoLog.data());
    std::cout << "compile error:" << std::endl << infoLog.data() << std::endl;
    // .....
}
...