• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

GLSL błąd składni.

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
198 wizyt
pytanie zadane 14 kwietnia 2017 w C i C++ przez Michał Gibas Pasjonat (19,630 p.)

Witam!

Oto mój program:
 

#define GLEW_STATIC
#include <GL/glew.h>
#include <GL/gl.h>
#include <GLFW/glfw3.h>
#include <stdio.h>
#include <cmath>
#include <chrono>
#include <vector>
#include <iostream>

GLuint compile_shaders()
{
    GLuint vertex_shader;
    GLuint fragment_shader;
    GLuint program;

    static const GLchar* vertex_shader_source[]={
    "#version 430                               \n",
    "                                           \n",
    "void main(void)                            \n",
    "{                                          \n",
    "   gl_Position = vec4(0.0, 0.0, 0.5, 1.0); \n",
    "}                                          \n",
    "                                           \n"
    };

    static const GLchar* fragment_shader_source[]={
    "#version 430                               \n",
    "                                           \n",
    "out vec4 color;                            \n",
    "void main(void)                            \n",
    "{                                          \n",
    "   color = vec4(0.0, 0.8, 1.0, 1.0);       \n",
    "}                                          \n",
    "                                           \n"
    };

    vertex_shader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex_shader, 1, vertex_shader_source, NULL);
    glCompileShader(vertex_shader);

    GLint success = 0;
    glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
    if(success == GL_FALSE){
        GLint maxLength = 0;
	    glGetShaderiv(vertex_shader, GL_INFO_LOG_LENGTH, &maxLength);

	    std::vector<GLchar> errorLog(maxLength);
	    glGetShaderInfoLog(vertex_shader, maxLength, &maxLength, &errorLog[0]);
        for(auto x : errorLog)
        {
            std::cout<<x;
        }
	    glDeleteShader(fragment_shader);
        exit(-1);
    }

    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);
    glCompileShader(fragment_shader);

    glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
    if(success == GL_FALSE){
        GLint maxLength = 0;
	    glGetShaderiv(fragment_shader, GL_INFO_LOG_LENGTH, &maxLength);

	    std::vector<GLchar> errorLog(maxLength);
	    glGetShaderInfoLog(fragment_shader, maxLength, &maxLength, &errorLog[0]);
        for(auto x : errorLog)
        {
            std::cout<<x;
        }
	    glDeleteShader(fragment_shader);
        exit(-1);
    }

    program = glCreateProgram();
    glAttachShader(program, vertex_shader);
    glAttachShader(program, fragment_shader);
    glLinkProgram(program);

    glDeleteShader(vertex_shader);
    glDeleteShader(fragment_shader);

    return program;
}

int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr, nullptr);
    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;
    glewInit();

    const GLfloat color[]= { 1.0f, 1.0f, 1.0f, 1.0f};

    auto start = std::chrono::system_clock::now();

    GLuint rendering_program = compile_shaders();
    GLuint vao;
    glCreateVertexArrays(1, &vao);
    glBindVertexArray(vao);

    while(!glfwWindowShouldClose(window))   
    {
        std::chrono::duration<double> diff = std::chrono::system_clock::now() - start;
        double currentTime = diff.count();

        glClearBufferfv(GL_COLOR, 0, color);

        glUseProgram(rendering_program);
        glPointSize(40.0f);
        glDrawArrays(GL_POINTS, 0, 1);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glDeleteVertexArrays(1, &vao);
    glDeleteProgram(rendering_program);

    glfwTerminate();
    return 0;
}

 

 

 

Shadery w programie nie chcą się kompilować, dostaję taki błąd:

0:1(13): error: syntax error, unexpected $end

Z góry dziękuję za pomoc!

2 odpowiedzi

+2 głosów
odpowiedź 14 kwietnia 2017 przez j23 Mędrzec (195,240 p.)
wybrane 22 kwietnia 2017 przez criss
 
Najlepsza

Nie znam się na OGL, ale czy drugi argument wywołania glShaderSource nie powinien mieć wartości odpowiadającej ilości "linii" w tablicy? Teraz jest 1 dla obu wywołań, a powinno być odpowiednio 7 i 8.

0 głosów
odpowiedź 14 kwietnia 2017 przez criss Mędrzec (172,570 p.)

Problem nie wynika z samego kodu shadera, tylko z tego co zrobiłeś. Każda tablica mająca reprezentująca kod shadera jest u ciebie tablicą łańcuchów znaków podczas gdy powinna być... pojedynczym łańcuchem. Także powinno to wyglądać tak:

    static const GLchar fragment_shader_source[]=
    "#version 430                               \n"
    "                                           \n"
    "out vec4 color;                            \n"
    "void main(void)                            \n"
    "{                                          \n"
    "   color = vec4(0.0, 0.8, 1.0, 1.0);       \n"
    "}                                          \n"
    "                                           \n";

Btw. utnij troche ten string chociaż o spacje bo bez sensu po prostu.

Podobne pytania

0 głosów
0 odpowiedzi 274 wizyt
pytanie zadane 23 maja 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)
0 głosów
0 odpowiedzi 155 wizyt
+1 głos
1 odpowiedź 1,106 wizyt
pytanie zadane 30 października 2015 w C i C++ przez criss Mędrzec (172,570 p.)

93,440 zapytań

142,434 odpowiedzi

322,681 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...