Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
3 / 3 / 1
Регистрация: 01.05.2017
Сообщений: 37

Некорректное отображение блока C++ OpenGL (Debian 9)

17.12.2017, 07:27. Показов 3802. Ответов 26

Студворк — интернет-сервис помощи студентам
Установлена библиотека libsfml-dev 2.4.1

Написал программу по первому примеру с видео на YouTube (Создание 3d игр на C++: Minecraft)

Стороны блока отображаются неправильно - те, что находятся дальше отрисовывются перед теми, что находятся ближе:


Исходный код:
C++
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
#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>
#include <iostream>
#include <GL/gl.h>
#include <GL/glu.h>
 
using namespace sf;
 
int main(){
    RenderWindow window(VideoMode(1280,900), "Mineisland");
 
    GLfloat xrot;
    GLfloat yrot;
    GLfloat zrot; 
 
    Texture t;
    t.loadFromFile("/home/denis/C++/MineIsland/resources/bg.jpg");
    Sprite bg(t);
 
    GLuint texture = 0;
    {
        Image image;
        image.loadFromFile("/home/denis/C++/MineIsland/resources/Blocks/dirt.jpg");
 
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.getSize().x, image.getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, image.getPixelsPtr());
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
    }
 
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glClearDepth(10.f);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90.f, 1.f, 1.f, 500.f);
    glEnable(GL_TEXTURE_2D);
 
    Clock clock;
 
    while (window.isOpen())
    {
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
        float time = clock.getElapsedTime().asSeconds() * 100;
        float size = 10.f;
 
        window.pushGLStates();
        window.draw(bg);
        window.popGLStates();
 
        glClear(GL_DEPTH_BUFFER_BIT);
 
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0, 0, -40);
 
        glRotatef(xrot,1.0f,0.0f,0.0f);
                glRotatef(yrot,0.0f,1.0f,0.0f);
                glRotatef(zrot,0.0f,0.0f,1.0f);
 
        glBindTexture(GL_TEXTURE_2D, texture);
        glBegin(GL_QUADS);
 
            //back
            glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
            glTexCoord2f(1, 0); glVertex3f(size, -size, -size);
            glTexCoord2f(1, 1); glVertex3f(size, size, -size);
            glTexCoord2f(0, 1); glVertex3f(-size, size, -size);
 
            //front
            glTexCoord2f(0, 0); glVertex3f(size, -size, size);
            glTexCoord2f(1, 0); glVertex3f(-size, -size, size);
            glTexCoord2f(1, 1); glVertex3f(-size, size, size);
            glTexCoord2f(0, 1); glVertex3f(size, size, size);
 
            //left
            glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
            glTexCoord2f(1, 0); glVertex3f(-size, -size, -size);
            glTexCoord2f(1, 1); glVertex3f(-size, size, -size);
            glTexCoord2f(0, 1); glVertex3f(-size, size, size);
 
            //right
            glTexCoord2f(0, 0); glVertex3f(size, -size, -size);
            glTexCoord2f(1, 0); glVertex3f(size, -size, size);
            glTexCoord2f(1, 1); glVertex3f(size, size, size);
            glTexCoord2f(0, 1); glVertex3f(size, size, -size);
 
            //bottom
            glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
            glTexCoord2f(1, 0); glVertex3f(size, -size, size);
            glTexCoord2f(1, 1); glVertex3f(size, -size, -size);
            glTexCoord2f(0, 1); glVertex3f(-size, -size, -size);
 
            //top
            glTexCoord2f(0, 0); glVertex3f(-size, size, -size);
            glTexCoord2f(1, 0); glVertex3f(size, size, -size);
            glTexCoord2f(1, 1); glVertex3f(size, size, size);
            glTexCoord2f(0, 1); glVertex3f(-size, size, size);
 
        glEnd();
 
            xrot+=0.3f;
            yrot+=0.2f;
            zrot+=0.4f;
 
            window.display();
    }
 
    glDeleteTextures(1, &texture);
 
    return 0;
}
Для компиляции использую команды в терминале:
Bash
1
2
3
g++ -c /home/denis/C++/MineIsland/main.cpp
g++ main.o -o main -lsfml-graphics -lsfml-window -lsfml-system -lGLU -lGL
./main
Я много экспериментировал с изменением кода, пытался все переделать абсолютно по другому, но выходило всегда одно и то же.
Заранее спасибо за помощь
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.12.2017, 07:27
Ответы с готовыми решениями:

Некорректное отображение диалогового окна. Win32API, OpenGL
Добрый вечер. Я пытаюсь сделать так, чтобы по нажатии кнопки меню появлялось модальное диалоговое окно. На данном этапе, содержащее...

Некорректное отображения блока div
Здравствуйте всем. Делаю шаблон на joomla. Ну здесь только будет вопрос по css. Не могу понять почему при измерении линейкой mySize блока...

Змейка на OpenGL. Некорректное изначальное расположение змейки
Сначала змейка появляется в левом нижнем углу экрана, а потом уже телепортируется по координатам (6;6), которые указаны в main, вместо...

26
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
17.12.2017, 14:14
Это что-то с SFML. Все OpenGL команды в порядке. Я перепроверил с созданием окна средствами SDL, там все нормально

Добавлено через 28 минут
Не сразу понял почему обновление экрана в SDL медленнее, чем в SFML, потом вспомнил про синхронизацию с частотой экрана. Если добавить SDL_GL_SetSwapInterval(0); то привязки не будет и скорости будут примерно одинаковыми (отчасти пишу для себя же, чтобы не забыть).
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
17.12.2017, 16:22
Я вижу вы активировали проверку буфера глубины:
C++
1
glEnable(GL_DEPTH_TEST);
Но забыли его очищать перед рисованием:
C++
1
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
0
3 / 3 / 1
Регистрация: 01.05.2017
Сообщений: 37
17.12.2017, 16:35  [ТС]
Спасибо, что заметили, хотя это и не решило проблему
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
17.12.2017, 16:53
Попробуйте скопировать и вставить мой пример кода, который выводит шахматную доску в 3D



C++
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
#include <SFML/Graphics.hpp>
 
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
 
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
 
unsigned int CreateShaderProgram(const GLchar* vertexShaderText, const GLchar* fragmentShaderText);
std::string LoadFileContents(const std::string filePath);
void DrawCube(glm::vec3 pos, GLfloat r, GLfloat g, GLfloat b);
 
glm::mat4 mvpMatrix;
glm::mat4 modelMatrix;
glm::mat4 normalMatrix;
glm::mat4 viewMatrix;
glm::mat4 projectionMatrix;
 
GLint u_color;
GLint u_normalMatrix;
GLint u_mvpMatrix;
 
int main()
{
    sf::ContextSettings settings;
 
    settings.majorVersion = 3;
    settings.minorVersion = 3;
    settings.depthBits = 24;
 
    sf::RenderWindow window(sf::VideoMode(500, 500), "Chessboard", sf::Style::Titlebar | sf::Style::Close, settings);
    window.setActive(true);
 
    //    v6----- v5
    //   /|      /|
    //  v1------v0|
    //  | |     | |
    //  | |v7---|-|v4
    //  |/      |/
    //  v2------v3
 
    GLfloat vertices[] = {
        0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5,     // v0-v1-v2-v3 front
        0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5,     // v0-v3-v4-v5 right
        0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5,     // v0-v5-v6-v1 up
        -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, // v1-v6-v7-v2 left
        -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, // v7-v4-v3-v2 down
        0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5  // v4-v7-v6-v5 back
    };
 
    GLfloat normals[] = {
        0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,     // v0-v1-v2-v3 front
        1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,     // v0-v3-v4-v5 right
        0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,     // v0-v5-v6-v1 up
        -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, // v1-v6-v7-v2 left
        0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, // v7-v4-v3-v2 down
        0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0  // v4-v7-v6-v5 back
    };
 
    GLushort indices[] = {
        0, 1, 2, 0, 2, 3,           // front
        4, 5, 6, 4, 6, 7,           // right
        8, 9, 10, 8, 10, 11,        // up
        12, 13, 14, 12, 14, 15,     // left
        16, 17, 18, 16, 18, 19,     // down
        20, 21, 22, 20, 22, 23      // back
    };
 
    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
 
    GLuint vertexVBOID;
    glGenBuffers(1, &vertexVBOID);
    glBindBuffer(GL_ARRAY_BUFFER, vertexVBOID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, (GLvoid*)0);
    glEnableVertexAttribArray(0);
 
    GLuint normalVBOID;
    glGenBuffers(1, &normalVBOID);
    glBindBuffer(GL_ARRAY_BUFFER, normalVBOID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(normals), normals, GL_STATIC_DRAW);
    glVertexAttribPointer(1, 3, GL_FLOAT, false, 0, (GLvoid*)0);
    glEnableVertexAttribArray(1);
 
    GLuint indexVBOID;
    glGenBuffers(1, &indexVBOID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
 
    //std::string vertexShaderText = LoadFileContents("shader.vert.glsl");
    //std::string fragmentShaderText = LoadFileContents("shader.frag.glsl");
 
    std::string vertexShaderSource =
        "#version 330 core\n"
        "layout(location = 0) in vec3 a_position;"
        "layout(location = 1) in vec3 a_normal;"
        "uniform vec3 u_lightDir;"
        "uniform mat4 u_normalMatrix;"
        "uniform mat4 u_mvpMatrix;"
        "out float v_dot;"
        "void main()"
        "{"
        "    gl_Position = u_mvpMatrix * vec4(a_position, 1.0);"
        "    vec4 normal = u_normalMatrix * vec4(a_normal, 1.0);"
        "    v_dot = max(dot(normalize(normal.xyz), u_lightDir), 0.0);"
        "}";
 
    std::string fragmentShaderSource =
        "#version 330 core\n"
        "uniform vec3 u_color;"
        "out vec4 outColor;"
        "in float v_dot;"
        "void main()"
        "{"
        "    vec3 diffuse = vec3(u_color * v_dot);"
        "    vec3 ambient = vec3(0.2, 0.2, 0.2) * u_color;"
        "    outColor = vec4(diffuse + ambient, 1.0);"
        "}";
 
    GLuint shaderProgram = CreateShaderProgram(vertexShaderSource.c_str(), fragmentShaderSource.c_str());
    glUseProgram(shaderProgram);
 
    u_color = glGetUniformLocation(shaderProgram, "u_color");
 
    viewMatrix = glm::lookAt(
        glm::vec3(12, 15, 23), // Camera is at (x, y, z), in World Space
        glm::vec3(3, 2, 4), // and looks at the origin
        glm::vec3(0, 1, 0)  // Head is up (set to 0,-1,0 to look upside-down)
    );
 
    GLint u_lightDir = glGetUniformLocation(shaderProgram, "u_lightDir");
    glm::vec4 lightDir = glm::vec4(2.0f, 10.0f, 4.0f, 0.0f);
    lightDir = glm::normalize(lightDir);
    glm::vec3 lightDir_eye = viewMatrix * lightDir;
    lightDir_eye = glm::normalize(lightDir_eye);
    glUniform3f(u_lightDir, lightDir_eye.x, lightDir_eye.y, lightDir_eye.z);
 
    u_normalMatrix = glGetUniformLocation(shaderProgram, "u_normalMatrix");
 
    projectionMatrix = glm::perspective(glm::radians(30.0f), 1.0f, 0.1f, 1000.0f);
 
    u_mvpMatrix = glGetUniformLocation(shaderProgram, "u_mvpMatrix");
 
    glEnable(GL_DEPTH_TEST);
 
    while (window.isOpen())
    {
        sf::Event ev;
        while (window.pollEvent(ev))
        {
            if (ev.type == sf::Event::Closed)
            {
                window.close();
            }
        }
 
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
        //modelMatrix = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, 0.0f));
 
        //mvpMatrix = projectionMatrix * viewMatrix * modelMatrix;
        //glUniformMatrix4fv(u_mvpMatrix, 1, false, &mvpMatrix[0][0]);
 
        //normalMatrix = glm::inverse(modelMatrix);
        //normalMatrix = glm::transpose(normalMatrix);
        //glUniformMatrix4fv(u_normalMatrix, 1, false, &normalMatrix[0][0]);
 
        //glUniform3f(u_color, 0.823f, 0.690f, 0.356f);
        //glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (GLvoid*)0);
 
        // Cells
        for (size_t row = 0; row < 8; row++)
        {
            for (size_t col = 0; col < 8; col++)
            {
                modelMatrix = glm::translate(glm::mat4(), glm::vec3(col, 0.0f, row));
                mvpMatrix = projectionMatrix * viewMatrix * modelMatrix;
                glUniformMatrix4fv(u_mvpMatrix, 1, false, &mvpMatrix[0][0]);
 
                normalMatrix = glm::inverse(modelMatrix);
                normalMatrix = glm::transpose(normalMatrix);
                glUniformMatrix4fv(u_normalMatrix, 1, false, &normalMatrix[0][0]);
 
                if ((row % 2 == 0 && col % 2 == 0) || (row % 2 != 0 && col % 2 != 0))
                {
                    glUniform3f(u_color, 0.0f, 0.0f, 0.0f);
                }
                else
                {
                    glUniform3f(u_color, 0.823f, 0.690f, 0.356f);
                }
                glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (GLvoid*)0);
            }
        }
 
        GLfloat color[] = { 0.368, 0.188, 0.109 };
 
        // Front border
        for (size_t i = 0; i < 8; i++)
        {
            DrawCube(glm::vec3(i, 0.0f, 8.0), color[0], color[1], color[2]);
        }
 
        // Left border
        for (int i = -1; i < 9; i++)
        {
            DrawCube(glm::vec3(-1.0f, 0.0f, i), color[0], color[1], color[2]);
        }
 
        // Back border
        for (size_t i = 0; i < 8; i++)
        {
            DrawCube(glm::vec3(i, 0.0f, -1.0), color[0], color[1], color[2]);
        }
 
        // Right border
        for (int i = -1; i < 9; i++)
        {
            DrawCube(glm::vec3(8.0f, 0.0f, i), color[0], color[1], color[2]);
        }
 
        window.display();
    }
 
    return 0;
}
 
void DrawCube(glm::vec3 pos, GLfloat r, GLfloat g, GLfloat b)
{
    modelMatrix = glm::translate(glm::mat4(), pos);
    mvpMatrix = projectionMatrix * viewMatrix * modelMatrix;
    glUniformMatrix4fv(u_mvpMatrix, 1, false, &mvpMatrix[0][0]);
 
    normalMatrix = glm::inverse(modelMatrix);
    normalMatrix = glm::transpose(normalMatrix);
    glUniformMatrix4fv(u_normalMatrix, 1, false, &normalMatrix[0][0]);
    glUniform3f(u_color, r, g, b);
 
    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (GLvoid*)0);
}
 
GLuint CreateShaderProgram(const GLchar * vertexShaderText, const GLchar * fragmentShaderText)
{
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    GLuint shaderProgram = glCreateProgram();
 
    glShaderSource(vertexShader, 1, &vertexShaderText, nullptr);
    glCompileShader(vertexShader);
 
    GLint success;
    GLchar infoLog[512];
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);
        std::cout << "Vertex Shader compilation failed: " << infoLog << std::endl;
    }
 
    glShaderSource(fragmentShader, 1, &fragmentShaderText, nullptr);
    glCompileShader(fragmentShader);
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);
        std::cout << "Fragment Shader compilation failed: " << infoLog << std::endl;
    }
 
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
 
    glLinkProgram(shaderProgram);
 
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
    if (!success)
    {
        glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);
        std::cout << "Program failed to link: " << infoLog << std::endl;
    }
 
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
 
    return shaderProgram;
}
 
std::string LoadFileContents(const std::string filePath)
{
    std::ifstream file(filePath);
    std::stringstream sstream;
 
    if (!file.is_open())
    {
        std::cout << "Could not find the file: " << filePath << std::endl;
    }
 
    sstream << file.rdbuf();
 
    return sstream.str();
}
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
17.12.2017, 16:57
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Но забыли его очищать перед рисованием:
Это он буфер цвета не очищает, но там все равно картинка на фоне, так что не важно. А глубина как раз очищается.
Нет, там что-то не так с инициализацией SFML.
1
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
17.12.2017, 17:19
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это он буфер цвета не очищает
Да, точно. Обычно забывают очищать буфер глубины, поэтому такая ерунда получается, я невнимально глянул.

Добавлено через 11 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
но там все равно картинка на фоне
Если бы это была картинка, то да. но это кубик в 3D, на который натянута текстурка, поэтому непонятно.
0
3 / 3 / 1
Регистрация: 01.05.2017
Сообщений: 37
17.12.2017, 17:47  [ТС]
Скопировал код, но у меня не было библиотек glm, я установил libglm-dev, найдя его через apt-file find
Однако, с остальным уже все не так просто:
Я проверил свою версию OpenGL на компьютере и даже переустановил (libqt4-opengl 4:4.8.2+dfsg-11 и libqt4-opengl-dev 4:4.8.7+dfsg-11)
Bash
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
/home/denis/main.cpp: In function ‘int main()’:
/home/denis/main.cpp:76:30: error: ‘glGenVertexArrays’ was not declared in this scope
     glGenVertexArrays(1, &vao);
                              ^
/home/denis/main.cpp:77:26: error: ‘glBindVertexArray’ was not declared in this scope
     glBindVertexArray(vao);
                          ^
/home/denis/main.cpp:80:33: error: ‘glGenBuffers’ was not declared in this scope
     glGenBuffers(1, &vertexVBOID);
                                 ^
/home/denis/main.cpp:81:46: error: ‘glBindBuffer’ was not declared in this scope
     glBindBuffer(GL_ARRAY_BUFFER, vertexVBOID);
                                              ^
/home/denis/main.cpp:82:77: error: ‘glBufferData’ was not declared in this scope
     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
                                                                             ^
/home/denis/main.cpp:83:63: error: ‘glVertexAttribPointer’ was not declared in this scope
     glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, (GLvoid*)0);
                                                               ^
/home/denis/main.cpp:84:32: error: ‘glEnableVertexAttribArray’ was not declared in this scope
     glEnableVertexAttribArray(0);
                                ^
/home/denis/main.cpp:129:31: error: ‘glUseProgram’ was not declared in this scope
     glUseProgram(shaderProgram);
                               ^
/home/denis/main.cpp:131:60: error: ‘glGetUniformLocation’ was not declared in this scope
     u_color = glGetUniformLocation(shaderProgram, "u_color");
                                                            ^
/home/denis/main.cpp:144:75: error: ‘glUniform3f’ was not declared in this scope
     glUniform3f(u_lightDir, lightDir_eye.x, lightDir_eye.y, lightDir_eye.z);
                                                                           ^
/home/denis/main.cpp:187:75: error: ‘glUniformMatrix4fv’ was not declared in this scope
                 glUniformMatrix4fv(u_mvpMatrix, 1, false, &mvpMatrix[0][0]);
                                                                           ^
/home/denis/main.cpp: In function ‘void DrawCube(glm::vec3, GLfloat, GLfloat, GLfloat)’:
/home/denis/main.cpp:241:63: error: ‘glUniformMatrix4fv’ was not declared in this scope
     glUniformMatrix4fv(u_mvpMatrix, 1, false, &mvpMatrix[0][0]);
                                                               ^
/home/denis/main.cpp:246:33: error: ‘glUniform3f’ was not declared in this scope
     glUniform3f(u_color, r, g, b);
                                 ^
/home/denis/main.cpp: In function ‘GLuint CreateShaderProgram(const GLchar*, const GLchar*)’:
/home/denis/main.cpp:253:58: error: ‘glCreateShader’ was not declared in this scope
     GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
                                                          ^
/home/denis/main.cpp:255:44: error: ‘glCreateProgram’ was not declared in this scope
     GLuint shaderProgram = glCreateProgram();
                                            ^
/home/denis/main.cpp:257:63: error: ‘glShaderSource’ was not declared in this scope
     glShaderSource(vertexShader, 1, &vertexShaderText, nullptr);
                                                               ^
/home/denis/main.cpp:258:33: error: ‘glCompileShader’ was not declared in this scope
     glCompileShader(vertexShader);
                                 ^
/home/denis/main.cpp:262:60: error: ‘glGetShaderiv’ was not declared in this scope
     glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
                                                            ^
/home/denis/main.cpp:265:63: error: ‘glGetShaderInfoLog’ was not declared in this scope
         glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);
                                                               ^
/home/denis/main.cpp:274:65: error: ‘glGetShaderInfoLog’ was not declared in this scope
         glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);
                                                                 ^
/home/denis/main.cpp:278:47: error: ‘glAttachShader’ was not declared in this scope
     glAttachShader(shaderProgram, vertexShader);
                                               ^
/home/denis/main.cpp:281:32: error: ‘glLinkProgram’ was not declared in this scope
     glLinkProgram(shaderProgram);
                                ^
/home/denis/main.cpp:283:59: error: ‘glGetProgramiv’ was not declared in this scope
     glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
                                                           ^
/home/denis/main.cpp:286:65: error: ‘glGetProgramInfoLog’ was not declared in this scope
         glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);
                                                                 ^
/home/denis/main.cpp:290:32: error: ‘glDeleteShader’ was not declared in this scope
     glDeleteShader(vertexShader);
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
17.12.2017, 18:09
Выводит, что не нашёл расширения. Я использую glad. Нужно добавить в проект эти три файла из архива: glad.zip. Замените весь код в main.cpp на этот:

C++
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
#include "glad.h"
#include <SFML/Graphics.hpp>
 
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
 
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
 
unsigned int CreateShaderProgram(const GLchar* vertexShaderText, const GLchar* fragmentShaderText);
std::string LoadFileContents(const std::string filePath);
void DrawCube(glm::vec3 pos, GLfloat r, GLfloat g, GLfloat b);
 
glm::mat4 mvpMatrix;
glm::mat4 modelMatrix;
glm::mat4 normalMatrix;
glm::mat4 viewMatrix;
glm::mat4 projectionMatrix;
 
GLint u_color;
GLint u_normalMatrix;
GLint u_mvpMatrix;
 
void fatalError(std::string errorString)
{
    std::cout << errorString << std::endl;
    std::cout << "Press any key to quit..." << std::endl;
    int tmp;
    std::cin >> tmp;
    exit(1);
}
 
int main()
{
    sf::ContextSettings settings;
 
    settings.majorVersion = 3;
    settings.minorVersion = 3;
    settings.depthBits = 24;
 
    sf::RenderWindow window(sf::VideoMode(500, 500), "Chessboard", sf::Style::Titlebar | sf::Style::Close, settings);
    window.setActive(true);
 
    if (!gladLoadGL())
    {
        fatalError("Faieled to initialize GLAD");
    }
 
    //    v6----- v5
    //   /|      /|
    //  v1------v0|
    //  | |     | |
    //  | |v7---|-|v4
    //  |/      |/
    //  v2------v3
 
    GLfloat vertices[] = {
        0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5,     // v0-v1-v2-v3 front
        0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5,     // v0-v3-v4-v5 right
        0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5,     // v0-v5-v6-v1 up
        -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, // v1-v6-v7-v2 left
        -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, // v7-v4-v3-v2 down
        0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5  // v4-v7-v6-v5 back
    };
 
    GLfloat normals[] = {
        0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,     // v0-v1-v2-v3 front
        1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,     // v0-v3-v4-v5 right
        0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,     // v0-v5-v6-v1 up
        -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, // v1-v6-v7-v2 left
        0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, // v7-v4-v3-v2 down
        0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0  // v4-v7-v6-v5 back
    };
 
    GLushort indices[] = {
        0, 1, 2, 0, 2, 3,           // front
        4, 5, 6, 4, 6, 7,           // right
        8, 9, 10, 8, 10, 11,        // up
        12, 13, 14, 12, 14, 15,     // left
        16, 17, 18, 16, 18, 19,     // down
        20, 21, 22, 20, 22, 23      // back
    };
 
    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
 
    GLuint vertexVBOID;
    glGenBuffers(1, &vertexVBOID);
    glBindBuffer(GL_ARRAY_BUFFER, vertexVBOID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, (GLvoid*)0);
    glEnableVertexAttribArray(0);
 
    GLuint normalVBOID;
    glGenBuffers(1, &normalVBOID);
    glBindBuffer(GL_ARRAY_BUFFER, normalVBOID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(normals), normals, GL_STATIC_DRAW);
    glVertexAttribPointer(1, 3, GL_FLOAT, false, 0, (GLvoid*)0);
    glEnableVertexAttribArray(1);
 
    GLuint indexVBOID;
    glGenBuffers(1, &indexVBOID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
 
    //std::string vertexShaderText = LoadFileContents("shader.vert.glsl");
    //std::string fragmentShaderText = LoadFileContents("shader.frag.glsl");
 
    std::string vertexShaderSource =
        "#version 330 core\n"
        "layout(location = 0) in vec3 a_position;"
        "layout(location = 1) in vec3 a_normal;"
        "uniform vec3 u_lightDir;"
        "uniform mat4 u_normalMatrix;"
        "uniform mat4 u_mvpMatrix;"
        "out float v_dot;"
        "void main()"
        "{"
        "    gl_Position = u_mvpMatrix * vec4(a_position, 1.0);"
        "    vec4 normal = u_normalMatrix * vec4(a_normal, 1.0);"
        "    v_dot = max(dot(normalize(normal.xyz), u_lightDir), 0.0);"
        "}";
 
    std::string fragmentShaderSource =
        "#version 330 core\n"
        "uniform vec3 u_color;"
        "out vec4 outColor;"
        "in float v_dot;"
        "void main()"
        "{"
        "    vec3 diffuse = vec3(u_color * v_dot);"
        "    vec3 ambient = vec3(0.2, 0.2, 0.2) * u_color;"
        "    outColor = vec4(diffuse + ambient, 1.0);"
        "}";
 
    GLuint shaderProgram = CreateShaderProgram(vertexShaderSource.c_str(), fragmentShaderSource.c_str());
    glUseProgram(shaderProgram);
 
    u_color = glGetUniformLocation(shaderProgram, "u_color");
 
    viewMatrix = glm::lookAt(
        glm::vec3(12, 15, 23), // Camera is at (x, y, z), in World Space
        glm::vec3(3, 2, 4), // and looks at the origin
        glm::vec3(0, 1, 0)  // Head is up (set to 0,-1,0 to look upside-down)
    );
 
    GLint u_lightDir = glGetUniformLocation(shaderProgram, "u_lightDir");
    glm::vec4 lightDir = glm::vec4(2.0f, 10.0f, 4.0f, 0.0f);
    lightDir = glm::normalize(lightDir);
    glm::vec3 lightDir_eye = viewMatrix * lightDir;
    lightDir_eye = glm::normalize(lightDir_eye);
    glUniform3f(u_lightDir, lightDir_eye.x, lightDir_eye.y, lightDir_eye.z);
 
    u_normalMatrix = glGetUniformLocation(shaderProgram, "u_normalMatrix");
 
    projectionMatrix = glm::perspective(glm::radians(30.0f), 1.0f, 0.1f, 1000.0f);
 
    u_mvpMatrix = glGetUniformLocation(shaderProgram, "u_mvpMatrix");
 
    glEnable(GL_DEPTH_TEST);
 
    while (window.isOpen())
    {
        sf::Event ev;
        while (window.pollEvent(ev))
        {
            if (ev.type == sf::Event::Closed)
            {
                window.close();
            }
        }
 
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
        //modelMatrix = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, 0.0f));
 
        //mvpMatrix = projectionMatrix * viewMatrix * modelMatrix;
        //glUniformMatrix4fv(u_mvpMatrix, 1, false, &mvpMatrix[0][0]);
 
        //normalMatrix = glm::inverse(modelMatrix);
        //normalMatrix = glm::transpose(normalMatrix);
        //glUniformMatrix4fv(u_normalMatrix, 1, false, &normalMatrix[0][0]);
 
        //glUniform3f(u_color, 0.823f, 0.690f, 0.356f);
        //glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (GLvoid*)0);
 
        // Cells
        for (size_t row = 0; row < 8; row++)
        {
            for (size_t col = 0; col < 8; col++)
            {
                modelMatrix = glm::translate(glm::mat4(), glm::vec3(col, 0.0f, row));
                mvpMatrix = projectionMatrix * viewMatrix * modelMatrix;
                glUniformMatrix4fv(u_mvpMatrix, 1, false, &mvpMatrix[0][0]);
 
                normalMatrix = glm::inverse(modelMatrix);
                normalMatrix = glm::transpose(normalMatrix);
                glUniformMatrix4fv(u_normalMatrix, 1, false, &normalMatrix[0][0]);
 
                if ((row % 2 == 0 && col % 2 == 0) || (row % 2 != 0 && col % 2 != 0))
                {
                    glUniform3f(u_color, 0.0f, 0.0f, 0.0f);
                }
                else
                {
                    glUniform3f(u_color, 0.823f, 0.690f, 0.356f);
                }
                glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (GLvoid*)0);
            }
        }
 
        GLfloat color[] = { 0.368, 0.188, 0.109 };
 
        // Front border
        for (size_t i = 0; i < 8; i++)
        {
            DrawCube(glm::vec3(i, 0.0f, 8.0), color[0], color[1], color[2]);
        }
 
        // Left border
        for (int i = -1; i < 9; i++)
        {
            DrawCube(glm::vec3(-1.0f, 0.0f, i), color[0], color[1], color[2]);
        }
 
        // Back border
        for (size_t i = 0; i < 8; i++)
        {
            DrawCube(glm::vec3(i, 0.0f, -1.0), color[0], color[1], color[2]);
        }
 
        // Right border
        for (int i = -1; i < 9; i++)
        {
            DrawCube(glm::vec3(8.0f, 0.0f, i), color[0], color[1], color[2]);
        }
 
        window.display();
    }
 
    return 0;
}
 
void DrawCube(glm::vec3 pos, GLfloat r, GLfloat g, GLfloat b)
{
    modelMatrix = glm::translate(glm::mat4(), pos);
    mvpMatrix = projectionMatrix * viewMatrix * modelMatrix;
    glUniformMatrix4fv(u_mvpMatrix, 1, false, &mvpMatrix[0][0]);
 
    normalMatrix = glm::inverse(modelMatrix);
    normalMatrix = glm::transpose(normalMatrix);
    glUniformMatrix4fv(u_normalMatrix, 1, false, &normalMatrix[0][0]);
    glUniform3f(u_color, r, g, b);
 
    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (GLvoid*)0);
}
 
GLuint CreateShaderProgram(const GLchar * vertexShaderText, const GLchar * fragmentShaderText)
{
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    GLuint shaderProgram = glCreateProgram();
 
    glShaderSource(vertexShader, 1, &vertexShaderText, nullptr);
    glCompileShader(vertexShader);
 
    GLint success;
    GLchar infoLog[512];
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);
        std::cout << "Vertex Shader compilation failed: " << infoLog << std::endl;
    }
 
    glShaderSource(fragmentShader, 1, &fragmentShaderText, nullptr);
    glCompileShader(fragmentShader);
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);
        std::cout << "Fragment Shader compilation failed: " << infoLog << std::endl;
    }
 
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
 
    glLinkProgram(shaderProgram);
 
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
    if (!success)
    {
        glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);
        std::cout << "Program failed to link: " << infoLog << std::endl;
    }
 
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
 
    return shaderProgram;
}
 
std::string LoadFileContents(const std::string filePath)
{
    std::ifstream file(filePath);
    std::stringstream sstream;
 
    if (!file.is_open())
    {
        std::cout << "Could not find the file: " << filePath << std::endl;
    }
 
    sstream << file.rdbuf();
 
    return sstream.str();
}
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
17.12.2017, 18:12
Я исправил код, вдруг вы успели скопировать.
0
3 / 3 / 1
Регистрация: 01.05.2017
Сообщений: 37
17.12.2017, 18:37  [ТС]
Создал папку проекта main с файлом main.cpp, добавил туда эти три файла и скопировал код, но теперь я даже не понимаю с какой стороны смотреть на эти ошибки:
Bash
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
main.o: In function `main':
main.cpp:(.text+0x14e): undefined reference to `sf::RenderWindow::RenderWindow(sf::VideoMode, sf::String const&, unsigned int, sf::ContextSettings const&)'
main.cpp:(.text+0x180): undefined reference to `sf::RenderWindow::setActive(bool)'
main.cpp:(.text+0x185): undefined reference to `gladLoadGL'
main.cpp:(.text+0x36a): undefined reference to `glad_glGenVertexArrays'
main.cpp:(.text+0x382): undefined reference to `glad_glBindVertexArray'
main.cpp:(.text+0x393): undefined reference to `glad_glGenBuffers'
main.cpp:(.text+0x3ab): undefined reference to `glad_glBindBuffer'
main.cpp:(.text+0x3c1): undefined reference to `glad_glBufferData'
main.cpp:(.text+0x3e0): undefined reference to `glad_glVertexAttribPointer'
main.cpp:(.text+0x409): undefined reference to `glad_glEnableVertexAttribArray'
main.cpp:(.text+0x417): undefined reference to `glad_glGenBuffers'
main.cpp:(.text+0x42f): undefined reference to `glad_glBindBuffer'
main.cpp:(.text+0x445): undefined reference to `glad_glBufferData'
main.cpp:(.text+0x464): undefined reference to `glad_glVertexAttribPointer'
main.cpp:(.text+0x48d): undefined reference to `glad_glEnableVertexAttribArray'
main.cpp:(.text+0x49b): undefined reference to `glad_glGenBuffers'
main.cpp:(.text+0x4b3): undefined reference to `glad_glBindBuffer'
main.cpp:(.text+0x4c9): undefined reference to `glad_glBufferData'
main.cpp:(.text+0x58d): undefined reference to `glad_glUseProgram'
main.cpp:(.text+0x59b): undefined reference to `glad_glGetUniformLocation'
main.cpp:(.text+0x6a4): undefined reference to `glad_glGetUniformLocation'
main.cpp:(.text+0x767): undefined reference to `glad_glUniform3f'
main.cpp:(.text+0x79f): undefined reference to `glad_glGetUniformLocation'
main.cpp:(.text+0x85e): undefined reference to `glad_glGetUniformLocation'
main.cpp:(.text+0x879): undefined reference to `glad_glEnable'
main.cpp:(.text+0x8d6): undefined reference to `glad_glClearColor'
main.cpp:(.text+0x8ff): undefined reference to `glad_glClear'
main.cpp:(.text+0xa9d): undefined reference to `glad_glUniformMatrix4fv'
main.cpp:(.text+0xbe8): undefined reference to `glad_glUniformMatrix4fv'
main.cpp:(.text+0xc57): undefined reference to `glad_glUniform3f'
main.cpp:(.text+0xc76): undefined reference to `glad_glUniform3f'
main.cpp:(.text+0xc9f): undefined reference to `glad_glDrawElements'
main.cpp:(.text+0xfbd): undefined reference to `sf::RenderWindow::~RenderWindow()'
main.cpp:(.text+0x107a): undefined reference to `sf::RenderWindow::~RenderWindow()'
main.o: In function `DrawCube(glm::tvec3<float, (glm::precision)0>, float, float, float)':
main.cpp:(.text+0x1213): undefined reference to `glad_glUniformMatrix4fv'
main.cpp:(.text+0x135e): undefined reference to `glad_glUniformMatrix4fv'
main.cpp:(.text+0x139d): undefined reference to `glad_glUniform3f'
main.cpp:(.text+0x13d8): undefined reference to `glad_glDrawElements'
main.o: In function `CreateShaderProgram(char const*, char const*)':
main.cpp:(.text+0x1419): undefined reference to `glad_glCreateShader'
main.cpp:(.text+0x142a): undefined reference to `glad_glCreateShader'
main.cpp:(.text+0x143b): undefined reference to `glad_glCreateProgram'
main.cpp:(.text+0x1447): undefined reference to `glad_glShaderSource'
main.cpp:(.text+0x1464): undefined reference to `glad_glCompileShader'
main.cpp:(.text+0x1472): undefined reference to `glad_glGetShaderiv'
main.cpp:(.text+0x1490): undefined reference to `glad_glGetShaderInfoLog'
main.cpp:(.text+0x14ed): undefined reference to `glad_glShaderSource'
main.cpp:(.text+0x150a): undefined reference to `glad_glCompileShader'
main.cpp:(.text+0x1518): undefined reference to `glad_glGetShaderiv'
main.cpp:(.text+0x1536): undefined reference to `glad_glGetShaderInfoLog'
main.cpp:(.text+0x1593): undefined reference to `glad_glAttachShader'
main.cpp:(.text+0x15a6): undefined reference to `glad_glAttachShader'
main.cpp:(.text+0x15b9): undefined reference to `glad_glLinkProgram'
main.cpp:(.text+0x15c7): undefined reference to `glad_glGetProgramiv'
main.cpp:(.text+0x15e5): undefined reference to `glad_glGetProgramInfoLog'
main.cpp:(.text+0x1642): undefined reference to `glad_glDeleteShader'
main.cpp:(.text+0x1650): undefined reference to `glad_glDeleteShader'
collect2: error: ld returned 1 exit status
Запускал через:
Bash
1
2
g++ -c /home/denis/main/main.cpp
g++ main.o -o -lsfml-graphics -lsfml-window -lsfml-system -lGLU -lGL
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
17.12.2017, 20:51
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Если бы это была картинка, то да. но это кубик в 3D, на который натянута текстурка, поэтому непонятно.
Цитата Сообщение от Ignatferum Посмотреть сообщение
window.pushGLStates();
window.draw(bg);
window.popGLStates();
Вот вывод фоновой картинки, пейзажика
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Выводит, что не нашёл расширения.
Можно использовать glew:
добавить в самое начало #include <GL_glew.h>
Потом в начале main(), после инициализации GLushort indices[]
C
1
2
glewExperimental = GL_TRUE;
GLenum glew_status = glewInit();
и в командную строку добавить -lGLEW
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
17.12.2017, 21:24
Ignatferum, ладно, забейте на мой код. Я просто использую загрузчик функций glad вместо glew.

Добавлено через 2 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вот вывод фоновой картинки, пейзажика
По-моему, проблема с пейзажем никак не связана. Если эти строки с пейзажем убрать, то проблема с неправильной последовательностью отрисовки граней кубика так и останется.

Добавлено через 7 минут
Можно попробовать в GLEW. У меня работает, выводит так же 3D шахматную доску. Странно, что у вас не работает.

C++
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
#define GLEW_STATIC
#include <GL/glew.h>
 
#include <SFML/Graphics.hpp>
 
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
 
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
 
unsigned int CreateShaderProgram(const GLchar* vertexShaderText, const GLchar* fragmentShaderText);
std::string LoadFileContents(const std::string filePath);
void DrawCube(glm::vec3 pos, GLfloat r, GLfloat g, GLfloat b);
 
glm::mat4 mvpMatrix;
glm::mat4 modelMatrix;
glm::mat4 normalMatrix;
glm::mat4 viewMatrix;
glm::mat4 projectionMatrix;
 
GLint u_color;
GLint u_normalMatrix;
GLint u_mvpMatrix;
 
void fatalError(std::string errorString)
{
    std::cout << errorString << std::endl;
    std::cout << "Press any key to quit..." << std::endl;
    int tmp;
    std::cin >> tmp;
    exit(1);
}
 
int main()
{
    sf::ContextSettings settings;
 
    settings.majorVersion = 3;
    settings.minorVersion = 3;
    settings.depthBits = 24;
 
    sf::RenderWindow window(sf::VideoMode(500, 500), "Chessboard", sf::Style::Titlebar | sf::Style::Close, settings);
    window.setActive(true);
 
    glewExperimental = true;
    GLenum result = glewInit();
    if (result != GLEW_OK)
    {
        std::cout << "Glew failed to initialize: " << glewGetErrorString(result) << std::endl;
    }
 
    //    v6----- v5
    //   /|      /|
    //  v1------v0|
    //  | |     | |
    //  | |v7---|-|v4
    //  |/      |/
    //  v2------v3
 
    GLfloat vertices[] = {
        0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5,     // v0-v1-v2-v3 front
        0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5,     // v0-v3-v4-v5 right
        0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5,     // v0-v5-v6-v1 up
        -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, // v1-v6-v7-v2 left
        -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, // v7-v4-v3-v2 down
        0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5  // v4-v7-v6-v5 back
    };
 
    GLfloat normals[] = {
        0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,     // v0-v1-v2-v3 front
        1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,     // v0-v3-v4-v5 right
        0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,     // v0-v5-v6-v1 up
        -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, // v1-v6-v7-v2 left
        0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, // v7-v4-v3-v2 down
        0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0  // v4-v7-v6-v5 back
    };
 
    GLushort indices[] = {
        0, 1, 2, 0, 2, 3,           // front
        4, 5, 6, 4, 6, 7,           // right
        8, 9, 10, 8, 10, 11,        // up
        12, 13, 14, 12, 14, 15,     // left
        16, 17, 18, 16, 18, 19,     // down
        20, 21, 22, 20, 22, 23      // back
    };
 
    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
 
    GLuint vertexVBOID;
    glGenBuffers(1, &vertexVBOID);
    glBindBuffer(GL_ARRAY_BUFFER, vertexVBOID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, (GLvoid*)0);
    glEnableVertexAttribArray(0);
 
    GLuint normalVBOID;
    glGenBuffers(1, &normalVBOID);
    glBindBuffer(GL_ARRAY_BUFFER, normalVBOID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(normals), normals, GL_STATIC_DRAW);
    glVertexAttribPointer(1, 3, GL_FLOAT, false, 0, (GLvoid*)0);
    glEnableVertexAttribArray(1);
 
    GLuint indexVBOID;
    glGenBuffers(1, &indexVBOID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
 
    //std::string vertexShaderText = LoadFileContents("shader.vert.glsl");
    //std::string fragmentShaderText = LoadFileContents("shader.frag.glsl");
 
    std::string vertexShaderSource =
        "#version 330 core\n"
        "layout(location = 0) in vec3 a_position;"
        "layout(location = 1) in vec3 a_normal;"
        "uniform vec3 u_lightDir;"
        "uniform mat4 u_normalMatrix;"
        "uniform mat4 u_mvpMatrix;"
        "out float v_dot;"
        "void main()"
        "{"
        "    gl_Position = u_mvpMatrix * vec4(a_position, 1.0);"
        "    vec4 normal = u_normalMatrix * vec4(a_normal, 1.0);"
        "    v_dot = max(dot(normalize(normal.xyz), u_lightDir), 0.0);"
        "}";
 
    std::string fragmentShaderSource =
        "#version 330 core\n"
        "uniform vec3 u_color;"
        "out vec4 outColor;"
        "in float v_dot;"
        "void main()"
        "{"
        "    vec3 diffuse = vec3(u_color * v_dot);"
        "    vec3 ambient = vec3(0.2, 0.2, 0.2) * u_color;"
        "    outColor = vec4(diffuse + ambient, 1.0);"
        "}";
 
    GLuint shaderProgram = CreateShaderProgram(vertexShaderSource.c_str(), fragmentShaderSource.c_str());
    glUseProgram(shaderProgram);
 
    u_color = glGetUniformLocation(shaderProgram, "u_color");
 
    viewMatrix = glm::lookAt(
        glm::vec3(12, 15, 23), // Camera is at (x, y, z), in World Space
        glm::vec3(3, 2, 4), // and looks at the origin
        glm::vec3(0, 1, 0)  // Head is up (set to 0,-1,0 to look upside-down)
    );
 
    GLint u_lightDir = glGetUniformLocation(shaderProgram, "u_lightDir");
    glm::vec4 lightDir = glm::vec4(2.0f, 10.0f, 4.0f, 0.0f);
    lightDir = glm::normalize(lightDir);
    glm::vec3 lightDir_eye = viewMatrix * lightDir;
    lightDir_eye = glm::normalize(lightDir_eye);
    glUniform3f(u_lightDir, lightDir_eye.x, lightDir_eye.y, lightDir_eye.z);
 
    u_normalMatrix = glGetUniformLocation(shaderProgram, "u_normalMatrix");
 
    projectionMatrix = glm::perspective(glm::radians(30.0f), 1.0f, 0.1f, 1000.0f);
 
    u_mvpMatrix = glGetUniformLocation(shaderProgram, "u_mvpMatrix");
 
    glEnable(GL_DEPTH_TEST);
 
    while (window.isOpen())
    {
        sf::Event ev;
        while (window.pollEvent(ev))
        {
            if (ev.type == sf::Event::Closed)
            {
                window.close();
            }
        }
 
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
        //modelMatrix = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, 0.0f));
 
        //mvpMatrix = projectionMatrix * viewMatrix * modelMatrix;
        //glUniformMatrix4fv(u_mvpMatrix, 1, false, &mvpMatrix[0][0]);
 
        //normalMatrix = glm::inverse(modelMatrix);
        //normalMatrix = glm::transpose(normalMatrix);
        //glUniformMatrix4fv(u_normalMatrix, 1, false, &normalMatrix[0][0]);
 
        //glUniform3f(u_color, 0.823f, 0.690f, 0.356f);
        //glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (GLvoid*)0);
 
        // Cells
        for (size_t row = 0; row < 8; row++)
        {
            for (size_t col = 0; col < 8; col++)
            {
                modelMatrix = glm::translate(glm::mat4(), glm::vec3(col, 0.0f, row));
                mvpMatrix = projectionMatrix * viewMatrix * modelMatrix;
                glUniformMatrix4fv(u_mvpMatrix, 1, false, &mvpMatrix[0][0]);
 
                normalMatrix = glm::inverse(modelMatrix);
                normalMatrix = glm::transpose(normalMatrix);
                glUniformMatrix4fv(u_normalMatrix, 1, false, &normalMatrix[0][0]);
 
                if ((row % 2 == 0 && col % 2 == 0) || (row % 2 != 0 && col % 2 != 0))
                {
                    glUniform3f(u_color, 0.0f, 0.0f, 0.0f);
                }
                else
                {
                    glUniform3f(u_color, 0.823f, 0.690f, 0.356f);
                }
                glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (GLvoid*)0);
            }
        }
 
        GLfloat color[] = { 0.368, 0.188, 0.109 };
 
        // Front border
        for (size_t i = 0; i < 8; i++)
        {
            DrawCube(glm::vec3(i, 0.0f, 8.0), color[0], color[1], color[2]);
        }
 
        // Left border
        for (int i = -1; i < 9; i++)
        {
            DrawCube(glm::vec3(-1.0f, 0.0f, i), color[0], color[1], color[2]);
        }
 
        // Back border
        for (size_t i = 0; i < 8; i++)
        {
            DrawCube(glm::vec3(i, 0.0f, -1.0), color[0], color[1], color[2]);
        }
 
        // Right border
        for (int i = -1; i < 9; i++)
        {
            DrawCube(glm::vec3(8.0f, 0.0f, i), color[0], color[1], color[2]);
        }
 
        window.display();
    }
 
    return 0;
}
 
void DrawCube(glm::vec3 pos, GLfloat r, GLfloat g, GLfloat b)
{
    modelMatrix = glm::translate(glm::mat4(), pos);
    mvpMatrix = projectionMatrix * viewMatrix * modelMatrix;
    glUniformMatrix4fv(u_mvpMatrix, 1, false, &mvpMatrix[0][0]);
 
    normalMatrix = glm::inverse(modelMatrix);
    normalMatrix = glm::transpose(normalMatrix);
    glUniformMatrix4fv(u_normalMatrix, 1, false, &normalMatrix[0][0]);
    glUniform3f(u_color, r, g, b);
 
    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (GLvoid*)0);
}
 
GLuint CreateShaderProgram(const GLchar * vertexShaderText, const GLchar * fragmentShaderText)
{
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    GLuint shaderProgram = glCreateProgram();
 
    glShaderSource(vertexShader, 1, &vertexShaderText, nullptr);
    glCompileShader(vertexShader);
 
    GLint success;
    GLchar infoLog[512];
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);
        std::cout << "Vertex Shader compilation failed: " << infoLog << std::endl;
    }
 
    glShaderSource(fragmentShader, 1, &fragmentShaderText, nullptr);
    glCompileShader(fragmentShader);
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);
        std::cout << "Fragment Shader compilation failed: " << infoLog << std::endl;
    }
 
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
 
    glLinkProgram(shaderProgram);
 
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
    if (!success)
    {
        glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);
        std::cout << "Program failed to link: " << infoLog << std::endl;
    }
 
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
 
    return shaderProgram;
}
 
std::string LoadFileContents(const std::string filePath)
{
    std::ifstream file(filePath);
    std::stringstream sstream;
 
    if (!file.is_open())
    {
        std::cout << "Could not find the file: " << filePath << std::endl;
    }
 
    sstream << file.rdbuf();
 
    return sstream.str();
}
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
17.12.2017, 22:00
Цитата Сообщение от 8Observer8 Посмотреть сообщение
По-моему, проблема с пейзажем никак не связана. Если эти строки с пейзажем убрать, то проблема с неправильной последовательностью отрисовки граней кубика так и останется.
Разумеется, проблема никак не связана с пейзажем. Вывод пейзажа на фоне делает ненужным очистку буфера цвета.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Можно попробовать в GLEW. У меня работает, выводит так же 3D шахматную доску. Странно, что у вас не работает.
glew у меня тоже работает (glad не проверял).
Но вопрос что же не так с исходным кодом ТСа.
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
17.12.2017, 22:26
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
glew у меня тоже работает (glad не проверял).
Но вопрос что же не так с исходным кодом ТСа.
Я имел ввиду, странно, что у TC мой код не работает.

Добавлено через 3 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вывод пейзажа на фоне делает ненужным очистку буфера цвета.
Даже без фона его можно не очищать. Он всё равно автоматически очистится, правда, не тем цветом, какой задали в clearColor, а чёрным.

Добавлено через 2 минуты
Ignatferum, вы не могли бы скинуть архив с вашим примером, с текстурами? Хочется у себя подцепить SFML и запустить, глянуть, как у меня будет работать.
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
18.12.2017, 01:00
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Даже без фона его можно не очищать. Он всё равно автоматически очистится, правда, не тем цветом, какой задали в clearColor, а чёрным.
Только если явно вызвать glClear(GL_COLOR_BUFFER_BIT), а этого у ТСа не было. Автоматически при переключении буфера он не очищается.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Ignatferum, вы не могли бы скинуть архив с вашим примером, с текстурами?
В чем проблема взять любые другие? У меня нормально подцепило рандомную gif и jpg вроде.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Хочется у себя подцепить SFML и запустить, глянуть, как у меня будет работать
Не будет работать проверка глубины, вообще.
0
3 / 3 / 1
Регистрация: 01.05.2017
Сообщений: 37
18.12.2017, 06:14  [ТС]
Вот мой проект: MineIsland.zip
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
18.12.2017, 08:10
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Только если явно вызвать glClear(GL_COLOR_BUFFER_BIT), а этого у ТСа не было. Автоматически при переключении буфера он не очищается.
Я имел ввиду, что если написать только glClear(GL_DEPTH_BUFFER_BIT); то буфер цвета будет автоматически очищаться даже без явного вызова glClear(GL_COLOR_BUFFER_BIT), но при этом будет использоваться не цвет указанный в clearColor, а цвет поумолчанию - чёрный.

Добавлено через 44 минуты
Ignatferum, я нашёл в чём проблема. У вас некоторые грани заданы по часовой стрелке. Определите последовательность вершин граней против часовой стрелки.

Такое замечание. У вас объявлены локальные переменные:
C++
1
2
3
    GLfloat xrot;
    GLfloat yrot;
    GLfloat zrot;
Далее, вызываются функции, которые используют эти переменные:
C++
1
2
3
        glRotatef(xrot, 1.0f, 0.0f, 0.0f);
        glRotatef(yrot, 0.0f, 1.0f, 0.0f);
        glRotatef(zrot, 0.0f, 0.0f, 1.0f);
Но к этому переменные хранят мусор. Вы их инициализируете ниже вызова glRotatef. Вы можете поставить точки останова и убедиться в этом. Если локальные переменные не инизиализировать, то они всегда хранят мусор. Я сейчас на Windows и Visual Studio 2015 даже не даёт запуститься программе из-за неинизиализированных переменных.

Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Не будет работать проверка глубины, вообще.
Вы не правы. Я запустил его код у себя. У меня проверка глубины прекрасно работает.

Добавлено через 3 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В чем проблема взять любые другие? У меня нормально подцепило рандомную gif и jpg вроде.
А я хотел именно его тестуры, мне лень искать и мне нужен актуальный код, самый последний.
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
18.12.2017, 08:14
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я имел ввиду, что если написать только glClear(GL_DEPTH_BUFFER_BIT); то буфер цвета будет автоматически очищаться даже без явного вызова glClear(GL_COLOR_BUFFER_BIT), но при этом будет использоваться не цвет указанный в clearColor, а цвет поумолчанию - чёрный.
С чего бы? Установка цвета очистки задается glClearColor()
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Ignatferum, я нашёл в чём проблема. У вас некоторые грани заданы по часовой стрелке. Определите последовательность вершин граней против часовой стрелки.
Снова мимо: тогда бы последняя грань при определенной ориентации не выводилась вовсе, но она выводится поверх всех остальных.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Но к этому переменные хранят мусор. Вы их инициализируете ниже вызова glRotatef.
Там они только изменяются, но не инициализируются. Но если повезло и начальное значение не слишком велико, будет работать нормально, ведь там не важно какой угол был в начале.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Вы не правы. Я запустил его код у себя. У меня проверка глубины прекрасно работает.
Как вы этого добились?
0
3 / 3 / 1
Регистрация: 01.05.2017
Сообщений: 37
18.12.2017, 08:17  [ТС]
8Observer8, у меня изначально не было этих строк, я добавлял их лишь в качестве эксперимента, мне сейчас хотя бы заставить программу нормально работать, что бы продолжить воплощение моей некоторой идеи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.12.2017, 08:17
Помогаю со студенческими работами здесь

Некорректное отображение
Всем привет, помоги пожалуйста советом. У меня есть сайт http://www.mia-luce.ru/ , во всех браузерах все работает нормально, но когда...

Некорректное отображение
недавно я хотел скопировать текст и отправить сообщение, своего решения на форум текст был взят из среды разработки русские слова...

Некорректное отображение
Помогите, пожалуйста, с проблемой. Есть какой той каркас.Макет будет фиксированным. Я задаю контейнеру (там, где будет находиться весь...

Некорректное отображение баннера в браузерах
Подскажите, пожалуйста, как решить проблему. Баннер, состоящий из 4 частей, отображается на мониторе не горизонтально, как положено, а...

Некорректное отображение в ИЕ
Добрый день! Как исправить некорректное отображение в ИЕ сайта advokatlogika.ru


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru