Ошибки с блеском

#java #opengl #minecraft

#java #opengl #Minecraft

Вопрос:

Я работаю над модом для Minecraft, и я пытаюсь сделать оружие золотым, когда конкретный человек входит в систему. У меня все получилось, кроме самого блеска. Я использовал код с этого сайта, чтобы получить окружающий, зеркальный, рассеянный и блеск золота, но когда я запускаю игру, я получаю эту ошибку:

 GL11.glMaterialf(GL11.GL_FRONT, GL11.GL_AMBIENT, 0.24725f);
GL11.glMaterialf(GL11.GL_FRONT, GL11.GL_DIFFUSE, 0.75164f);
GL11.glMaterialf(GL11.GL_FRONT, GL11.GL_SPECULAR, 0.628281f);
GL11.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 0.4f);
  

Я скопировал код с сайта, но мне не хотелось использовать шейдер, поэтому я попытался записать его как код OpenGL (как вы можете видеть выше). Однако, когда пистолет рендерится, он окрашивается в золотой цвет (потому что я пишу цветовой код), но он не блестит, и эта ошибка выводится в консоль:

 2014-06-21 18:27:36 [SEVERE] [Minecraft-Client] ########## GL ERROR ##########
2014-06-21 18:27:36 [SEVERE] [Minecraft-Client] @ Post render
2014-06-21 18:27:36 [SEVERE] [Minecraft-Client] 1280: Invalid enum
  

У кого-нибудь есть какие-нибудь идеи? Очевидно, что это вопрос не о моддинге Minecraft, а скорее о рендеринге OpenGL.

(кстати, это рендеринг с помощью LWJGL и Java 6)

Ответ №1:

Ошибка возникает потому GL_AMBIENT , GL_DIFFUSE что , и GL_SPECULAR не являются допустимыми аргументами для glMaterialf() . Они определяют векторы RGBA материальных коэффициентов, а не только одно скалярное значение, как вы пытаетесь установить. Вы должны использовать glMaterialfv() вместо этого и указать 4 компонента для каждого параметра. Таблица, которую вы связали, уже делает это очень понятным, имея 3 значения (RGB) для каждого параметра, они просто игнорируют альфа-компонент, который на самом деле не имеет отношения к самому материалу, но вам все равно нужно его указать.

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

Комментарии:

1. «Но я также должен предупредить вас, что результат все равно будет выглядеть не слишком реалистично, если не будут использованы некоторые методы отражения, такие как отображение среды». — вы когда-нибудь видели Minecraft? 🙂

2. @GuyRT: да, у меня есть. Меня это совсем не впечатлило. 🙂

3. Кроме того, 0.4 — это очень маленькое значение для GL_SHININESS . На самом деле это не сделает ваш материал блестящим. Для блестящего материала вам нужно будет использовать значение, которое может составлять от 30,0 для умеренно блестящего до 100,0 для действительно блестящего.

4. на самом деле, сам связанный сайт дает пример использования и объясняет, что указанное значение блеска должно быть умножено на 128.

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