Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
General_TaO
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 138
#1

Передача вершинного и фрагментарного шейдоров проекту

03.09.2017, 13:07. Просмотров 765. Ответов 4
Метки нет (Все метки)

Ку всем!

Предыстория:
Столкнулся с проблемой, которую я написал в этой теме. Т.к. прогресс решения проблемы не сдвигался со своего места, я решил провести собственное расследование (если вы знающий человек, то тоже можете помочь).

Использую QTCreator и OpenGL 4.4 + GLWF + GLAD + GLM. Изучаю OpenGL 3.3+ по этим урокам.

Проблема:

Автор предложил мне написать код вершинных и фрагментарных шейдеров в отдельных файлах исходного кода.

Цитата Сообщение от Автор
Здесь мы сохранили исходный код вершинного и фрагментарного шейдера в двух файлах, называемых shader.vsи shader.fs. Вы можете указать свои шейдерные файлы, как вам нравится; Я лично нахожу расширения .vsи .fsдовольно интуитивно понятным.
Это перевод с английского языка, который перевел мне сайт (точнее, функция браузера).

Речь идёт об этой строчке кода:
C++ (Qt)
1
Shader ourShader("path/to/shaders/shader.vs", "path/to/shaders/shader.fs");
При компиляции проекта с использованием этой функции возникает неясность: даже если мы напишем какую-то чушь в кавычках для передачи пути расположения файла с шейдерами, проект соберётся, но компиляция, естественно, пройдёт неудачно. Тоже самое происходит и при указании верного расположения файлов (в моём случае файлы расположены в папке с проектом и я просто указываю имя файла). И тут я понимаю, что проект собирается не полностью.

Вопрос: Как правильно передать эти фалы проекту для использования?

P.S. использую созданный автором класс шейдеров(код на сайте с гайдами). Подробнее вы можете прочитать в теме из предыстории.

Добавлено через 2 часа 47 минут
После некоторых экспериментов выяснилось, что конструктор моего класса шейдеров не может открыть файлы с кодами шейдеров. Сам класс:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#ifndef MYSHADER_h
#define MYSHADER_h
 
#include <glad/glad.h>
 
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
 
class Shader
{
public:
    unsigned int ID;
    // constructor generates the shader on the fly
    // ------------------------------------------------------------------------
    Shader(const char* vertexPath, const char* fragmentPath)
    {
        std::cout << "Start\n";
        // 1. retrieve the vertex/fragment source code from filePath
        std::string vertexCode;
        std::string fragmentCode;
        std::ifstream vShaderFile;
        std::ifstream fShaderFile;
        // ensure ifstream objects can throw exceptions:
        std::cout << "Pas 1. Ensure ifstream objects can throw exception...\n";
        vShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);
        fShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);
         std::cout << "Pas 1. Complite.\n";
        try
        {
            // open files
             std::cout << "Pas 2. Open files...\n";
            vShaderFile.open(vertexPath);
            std::cout << " vShaderFile.open(vertexPath);\n";
            fShaderFile.open(fragmentPath);
            std::cout << " fShaderFile.open(fragmentPath);\n";
            std::stringstream vShaderStream, fShaderStream;
            std::cout << "  std::stringstream vShaderStream, fShaderStream;\n";
            // read file's buffer contents into streams
            vShaderStream << vShaderFile.rdbuf();
            fShaderStream << fShaderFile.rdbuf();
            // close file handlers
            vShaderFile.close();
            fShaderFile.close();
            // convert stream into string
            vertexCode   = vShaderStream.str();
            fragmentCode = fShaderStream.str();
            std::cout << "Pas 2. Complite.\n";
        }
        catch (std::ifstream::failure e)
        {
            std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
        }
        const char* vShaderCode = vertexCode.c_str();
        const char * fShaderCode = fragmentCode.c_str();
        // 2. compile shaders
        unsigned int vertex, fragment;
        int success;
        char infoLog[512];
        // vertex shader
        vertex = glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vertex, 1, &vShaderCode, NULL);
        glCompileShader(vertex);
        checkCompileErrors(vertex, "VERTEX");
        // fragment Shader
        fragment = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fragment, 1, &fShaderCode, NULL);
        glCompileShader(fragment);
        checkCompileErrors(fragment, "FRAGMENT");
        // shader Program
        ID = glCreateProgram();
        glAttachShader(ID, vertex);
        glAttachShader(ID, fragment);
        glLinkProgram(ID);
        checkCompileErrors(ID, "PROGRAM");
        // delete the shaders as they're linked into our program now and no longer necessary
        glDeleteShader(vertex);
        glDeleteShader(fragment);
    }
    // activate the shader
    // ------------------------------------------------------------------------
    void use()
    {
        glUseProgram(ID);
    }
    // utility uniform functions
    // ------------------------------------------------------------------------
    void setBool(const std::string &name, bool value) const
    {
        glUniform1i(glGetUniformLocation(ID, name.c_str()), (int)value);
    }
    // ------------------------------------------------------------------------
    void setInt(const std::string &name, int value) const
    {
        glUniform1i(glGetUniformLocation(ID, name.c_str()), value);
    }
    // ------------------------------------------------------------------------
    void setFloat(const std::string &name, float value) const
    {
        glUniform1f(glGetUniformLocation(ID, name.c_str()), value);
    }
 
private:
    // utility function for checking shader compilation/linking errors.
    // ------------------------------------------------------------------------
    void checkCompileErrors(unsigned int shader, std::string type)
    {
        int success;
        char infoLog[1024];
        if (type != "PROGRAM")
        {
            glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
            if (!success)
            {
                glGetShaderInfoLog(shader, 1024, NULL, infoLog);
                std::cout << "ERROR::SHADER_COMPILATION_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;
            }
        }
        else
        {
            glGetProgramiv(shader, GL_LINK_STATUS, &success);
            if (!success)
            {
                glGetProgramInfoLog(shader, 1024, NULL, infoLog);
                std::cout << "ERROR::PROGRAM_LINKING_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;
            }
        }
    }
};
#endif
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2017, 13:07
Ответы с готовыми решениями:

Приведение типов внутри вершинного шейдера
Хочу в атрибутах вершины передавать кроме координат в формате float, индекс в...

Передача ссылки в конструктор (передача данных между формами)
Из темы &quot;Ответы на 7 самых частых вопроса по WinForms&quot; Реализовал метод № 2.3...

Передача нескольких параметров в pthread_create (передача структуры)
Здравствуйте. Мне нужно передать последним параметром в функцию pthread_create...

Подключение БД к Qt проекту
Всем доброго дня. Прошу помочь разобраться с подключением бд к программе Qt....

Доступ к проекту
Есть проект в нем много форм установлена связь с БД Как организовать проверку...

4
vindast
56 / 54 / 10
Регистрация: 25.04.2017
Сообщений: 498
03.09.2017, 13:17 #2
Лучший ответ Сообщение было отмечено General_TaO как решение

Решение

Парень, остановись. Ты используешь qt, а потом используешь std::string и тд. Если используешь qt, используй QString и тд.
Это раз.
Два, директорию надо указывать либо полностью, либо относительно того места, где у тебя сам проект.
Ты себе в cout ( а лучше юзай qDebug()<<) выведи патч к шейдерам.
Уж при таком подходе то ...
Цитата Сообщение от General_TaO Посмотреть сообщение
"path/to/shaders/shader.fs"
"path//to//shaders//shader.fs"
Про служебные символы почитай...
0
General_TaO
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 138
03.09.2017, 13:50  [ТС] #3
Парень, остановись. Ты используешь qt, а потом используешь std::string и тд. Если используешь qt, используй QString и тд.
Чет, я первый раз слышу... И много таких "подмен" функций есть?
Я использую проект без QT . В этом случает тоже надо менять все?
0
vindast
56 / 54 / 10
Регистрация: 25.04.2017
Сообщений: 498
03.09.2017, 14:08 #4
Тогда зачем тебе использовать qt?
0
General_TaO
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 138
03.09.2017, 14:11  [ТС] #5
Чувак, благодарчик! Решил проблему, указав абсолютный путь к файлу с кодом шейдеров, при этом \ заменил на \\.
0
03.09.2017, 14:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2017, 14:11

Присоединение БД к проекту
Здравствуйте! У меня возник такой вопрос: при создании проекта я подсоединяю...

Совет по проекту
Здравствуйте. Столкнулся с такой ситуацией. Скачал готовый проект...

Подключение БД к проекту
Здравствуйте форумчане. Подскажите как подключить базу *.sql к проекту в ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru