OpenGL communityФорумУроки по OpenGL

Урок 3 - Вращающийся куб с текстурой (комментарии)

Страницы: 1 2 3 Следующая »
#0
20:08, 26 окт 2010

Урок 3 - Вращающийся куб с текстурой (комментарии)

Это сообщение сгенерировано автоматически.

#1
20:08, 26 окт 2010

Дублирую http://code.google.com/p/gl33lessons/wiki/Lesson03

#2
14:29, 18 ноя 2010

Функции snprintf() в <cstdio> нету, но она есть в <stdio.h> :)

А нормально сделать в common.h вот так:

#include <cstdio>
#include <stdio.h>
...

?

Ещё 2 вопроса.
1) Зачем функции LoadFile в параметрах указатель на указатель (uint8_t **buffer)? Почему одного указателя не достаточно?
2) И почему мы при переключении в фулскрин изменяем разрешение экрана? Может было бы лучше просто растягивать окно на весь экран? Так переключение будет происходить более красиво и на широкоформатниках не будет ограниченного квадратика с чёрными полосами слева и справа.

===

А, ещё не понятно, почему мы грузим шейдер, как binary? Он же, вроде, в текстовом формате?

#3
15:38, 18 ноя 2010

Pixar
> Ещё 2 вопроса.
> 1) Зачем функции LoadFile в параметрах указатель на указатель (uint8_t
> **buffer)? Почему одного указателя не достаточно?

В этой функции под буфер выделяется место посредство new, поэтому указатель на указатель.

> 2) И почему мы при переключении в фулскрин изменяем разрешение экрана? Может
> было бы лучше просто растягивать окно на весь экран? Так переключение будет
> происходить более красиво и на широкоформатниках не будет ограниченного
> квадратика с чёрными полосами слева и справа.

Потому что, если вы не заметили, обработчика изменения размеров окна нету, добавить их несложно, но для урока я пока не стал этого делать.

> А, ещё не понятно, почему мы грузим шейдер, как binary? Он же, вроде, в
> текстовом формате?

Компилятору на самом деле все равно, поэтому грузим как есть, "в сыром виде" так сказать. Но можно и в текстовом грузить, разницы никакой быть не должно.

#4
15:47, 18 ноя 2010

KpeHDeJIb
> В этой функции под буфер выделяется место посредство new, поэтому указатель на указатель.

Всмысле это ты так для себя для удобства делаешь?
Я лично один указатель использую в любом случае...

#5
17:07, 18 ноя 2010

Спасибо за ответы!

С первым вопросом я почти разобрался. В VisualC++ функция, оказывается, называется по-другому - sprintf_s :).

Теперь такой вопрос. Почему функции snprintf() параметр size передаётся равным 0xFF, а размер буфера равен 0x100? Он ведь, по идее, скопирует на 1 меньше, чем size и в конец добавит '\0"?

#6
18:34, 18 ноя 2010

Executor
> Я лично один указатель использую в любом случае...

Я тебя видимо не понимаю, вот попробуй это, результат очевиден:

#include <stdio.h>

void foo(char *buffer)
{
  buffer = new char [1024];
}

void bar(char **buffer)
{
  *buffer = new char [1024];
}

int main()
{
  char *buffer = NULL;

  foo(buffer);
  printf("buffer = %p\n", buffer);

  bar(&buffer);
  printf("buffer = %p\n", buffer);

  return 0;
}

Pixar
> Теперь такой вопрос. Почему функции snprintf() параметр size передаётся равным
> 0xFF, а размер буфера равен 0x100? Он ведь, по идее, скопирует на 1 меньше, чем
> size и в конец добавит '\0"?

Это у меня плохие воспоминания о всяких strncpy видимо, вообще сама функция добавляет \0 в конец, ты прав.

#7
20:23, 18 ноя 2010

KpeHDeJIb
> Я тебя видимо не понимаю, вот попробуй это, результат очевиден:

Это я не понял просто о чём речь... Теперь понятно...

#8
19:02, 27 ноя 2010
bool InputIsKeyDown(uint8_t key)
{
        return (g_input.keyState[key] != 0);
}

bool InputIsKeyPressed(uint8_t key)
{
        bool pressed = (g_input.keyState[key] == INPUT_PRESSED);
        g_input.keyState[key] = INPUT_DOWN;
        return pressed;
}

Не понимаю, что делает "INPUT_DOWN". Вроде бы достаточно, чтобы событие нажатия клавиши фиксировалось с помощью INPUT_PRESSED, а при отпускании клавиши - с помощью INPUT_UP.

#9
11:44, 29 ноя 2010

KpeHDeJIb
> В этой функции под буфер выделяется место посредством new, поэтому указатель на
> указатель.

Таким же образом выделяю память через - указатель на указатель.
И мне интересно стало, а такой метод он безопасен с точки зрения утечек памяти?
Кто и когда будет освобождать выделенную память, если это вообще происходит, после того как необходимость в ней отпала?)

При выходе из main’a для char *buffer crt-runtime вызовет delete[]?

#10
12:01, 29 ноя 2010

.Pixel
> Таким же образом выделяю память через - указатель на указатель.
> И мне интересно стало, а такой метод он безопасен с точки зрения утечек
> памяти?
> Кто и когда будет освобождать выделенную память, если это вообще происходит,
> после того как необходимость в ней отпала?)
>
> При выходе из main’a для char *buffer crt-runtime вызовет delete[]?

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

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

CRT никогда сам для твоих new не вызовет delete, для каких-то своих вызывает, для твоих - нет.

#11
6:40, 30 ноя 2010

KpeHDeJIb
А мой вопрос? =)

#12
13:11, 30 ноя 2010

Pixar
> Не понимаю, что делает "INPUT_DOWN". Вроде бы достаточно, чтобы событие нажатия
> клавиши фиксировалось с помощью INPUT_PRESSED, а при отпускании клавиши - с
> помощью INPUT_UP.

У клавиши три состояния по сути, DOWN - нажата и держится, PRESSED - нажата и отпущена, UP - не нажата. А у меня эмуляция этого, чтобы нажатие не происходило постоянно у клавиши пока ее держат, ставится DOWN - т.е. нажата уже какое-то время, PRESSED - нажата только что. PRESSED полезен для одноразового срабатывания (например Пробел или Ввод единоразово), а DOWN для продолжительного действия, например движение вперед :)

#13
21:11, 22 дек 2010

Исправьте

void Matrix4Translation(Matrix4 M, float x, float y, float z)
и
void Matrix4Mul(Matrix4 M, Matrix4 A, Matrix4 B)

На

void Matrix4Translation(Matrix4& M, float x, float y, float z)
и
void Matrix4Mul(Matrix4& M, const Matrix4& A, const Matrix4& B)

Без ссылок работать не будет...

#14
14:08, 27 дек 2010

Кукурузо!
Тип Matrix4 определен как:

typedef float Matrix4[16];

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

Страницы: 1 2 3 Следующая »
OpenGL communityФорумУроки по OpenGL

Тема в архиве.