Суббота, 20 Апреля 2024, 03:20

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Общие обсуждения программистов » GLSL (OpenGL Shading Language)
GLSL
MDKedДата: Среда, 27 Марта 2013, 15:12 | Сообщение # 1
частый гость
Сейчас нет на сайте
Интересуют пошаговые мануалы\туториалы (русский\английский) по работе в 2Д в связке с lwjgl, кто нибудь сталкивался с такими или может подсказать в каком направлении копать? У самого пока тяжко с поисками, находятся или готовые варианты (которые не понятны в связи с отсутствием опыта) или же библиотеки которые могут выполнить необходимые задания, но там уже всё сделано за нас, а мне хотелось бы с основ пройти и самому сделать.

Добавлено (27.03.2013, 15:12)
---------------------------------------------
также буду делиться своими поисками, если кому-то будет интересно.
https://github.com/mattdesl/lwjgl-basics/wiki/Shaders


Стою на асфальте я в лыжи обутый.
То ли лыжи не едут, то ли я баганутый.
"O-Wars"


Сообщение отредактировал MDKed - Среда, 27 Марта 2013, 15:12
Snake174Дата: Четверг, 28 Марта 2013, 08:00 | Сообщение # 2
участник
Сейчас нет на сайте
Держи. Не жалко. Сам тут начал недавно Java изучать. Решил сделать движок на основе lwjgl.
Код

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.FloatBuffer;
import java.util.HashMap;
import java.util.Map;
import org.lwjgl.opengl.ARBFragmentShader;
import org.lwjgl.opengl.ARBShaderObjects;
import org.lwjgl.opengl.ARBVertexShader;
import org.lwjgl.opengl.GL11;

public class ShaderManager
{
   private Map<String, Integer> shaders = new HashMap<String, Integer>();

   public ShaderManager()
   {
   }

   private static String getLogInfo( int obj )  
   {
     return ARBShaderObjects.glGetInfoLogARB( obj, ARBShaderObjects.glGetObjectParameteriARB( obj, ARBShaderObjects.GL_OBJECT_INFO_LOG_LENGTH_ARB ) );
   }

   private String readFileAsString( String fileName ) throws Exception  
   {
     StringBuilder source = new StringBuilder();
     FileInputStream in = new FileInputStream( fileName );
     Exception exception = null;
     BufferedReader reader;

     try
     {
       reader = new BufferedReader( new InputStreamReader( in, "UTF-8" ) );
       Exception innerExc= null;

       try  
       {
         String line;

         while ((line = reader.readLine()) != null)
         {
           source.append( line ).append('\n');
         }
       }
       catch (Exception exc)  
       {
         exception = exc;
       }
       finally  
       {
         try  
         {
           reader.close();
         }
         catch (Exception exc)  
         {
           if (innerExc == null)
           {
             innerExc = exc;
           }
           else
           {
             exc.printStackTrace();
           }
         }
       }
   
       if (innerExc != null)
       {
         throw innerExc;
       }
     }
     catch (Exception exc)  
     {
       exception = exc;
     }
     finally  
     {
       try  
       {
         in.close();
       }
       catch (Exception exc)  
       {
         if (exception == null)
         {
           exception = exc;
         }
         else
         {
           exc.printStackTrace();
         }
       }

       if (exception != null)
       {
         throw exception;
       }
     }

     return source.toString();
   }

   public void loadShader( String shaderName, String fileName )
   {
     if (!shaders.containsKey( shaderName ))
     {       
       int shader = 0;
       int vertShader = 0;
       int fragShader = 0;

       vertShader = ARBShaderObjects.glCreateShaderObjectARB( ARBVertexShader.GL_VERTEX_SHADER_ARB );

       if (vertShader == 0)
       {
         return;
       }

       try
       {
         ARBShaderObjects.glShaderSourceARB( vertShader, readFileAsString( fileName + ".vert" ) );
       }
       catch (Exception ex)
       {
         System.out.println("Can't load vertex shader: " + ex.toString());
         return;
       }

       ARBShaderObjects.glCompileShaderARB( vertShader );

       if (ARBShaderObjects.glGetObjectParameteriARB( vertShader, ARBShaderObjects.GL_OBJECT_COMPILE_STATUS_ARB ) == GL11.GL_FALSE)
       {
         ARBShaderObjects.glDeleteObjectARB( vertShader );
         throw new RuntimeException( "Error creating shader: " + getLogInfo( vertShader ) );
       }

       fragShader = ARBShaderObjects.glCreateShaderObjectARB( ARBFragmentShader.GL_FRAGMENT_SHADER_ARB );

       if (fragShader == 0)
       {
         return;
       }

       try
       {
         ARBShaderObjects.glShaderSourceARB( fragShader, readFileAsString( fileName + ".frag" ) );
       }
       catch (Exception ex)
       {
         ARBShaderObjects.glDeleteObjectARB( vertShader );
         System.out.println("Can't load fragment shader: " + ex.toString());
         return;
       }

       ARBShaderObjects.glCompileShaderARB( fragShader );

       if (ARBShaderObjects.glGetObjectParameteriARB( fragShader, ARBShaderObjects.GL_OBJECT_COMPILE_STATUS_ARB ) == GL11.GL_FALSE)
       {
         ARBShaderObjects.glDeleteObjectARB( vertShader );
         ARBShaderObjects.glDeleteObjectARB( fragShader );
         System.out.println( getLogInfo( fragShader ) );

         return;
       }

       shader = ARBShaderObjects.glCreateProgramObjectARB();

       if (shader == 0)
       {
         return;
       }

       ARBShaderObjects.glAttachObjectARB( shader, vertShader );
       ARBShaderObjects.glAttachObjectARB( shader, fragShader );
       ARBShaderObjects.glLinkProgramARB( shader );

       if (ARBShaderObjects.glGetObjectParameteriARB( shader, ARBShaderObjects.GL_OBJECT_LINK_STATUS_ARB ) == GL11.GL_FALSE)
       {
         ARBShaderObjects.glAttachObjectARB( shader, vertShader );
         ARBShaderObjects.glAttachObjectARB( shader, fragShader );
         System.out.println( getLogInfo( shader ) );

         return;
       }

       ARBShaderObjects.glValidateProgramARB( shader );

       if (ARBShaderObjects.glGetObjectParameteriARB( shader, ARBShaderObjects.GL_OBJECT_VALIDATE_STATUS_ARB ) == GL11.GL_FALSE)
       {
         ARBShaderObjects.glAttachObjectARB( shader, vertShader );
         ARBShaderObjects.glAttachObjectARB( shader, fragShader );
         System.out.println( getLogInfo( shader ) );

         return;
       }

       shaders.put( shaderName, shader );
     }
   }

   public void loadShader( String shaderName, String vs, String fs )
   {
     if (!shaders.containsKey( shaderName ))
     {       
       int shader = 0;
       int vertShader = 0;
       int fragShader = 0;

       vertShader = ARBShaderObjects.glCreateShaderObjectARB( ARBVertexShader.GL_VERTEX_SHADER_ARB );

       if (vertShader == 0)
       {
         return;
       }

       ARBShaderObjects.glShaderSourceARB( vertShader, vs );       
       ARBShaderObjects.glCompileShaderARB( vertShader );

       if (ARBShaderObjects.glGetObjectParameteriARB( vertShader, ARBShaderObjects.GL_OBJECT_COMPILE_STATUS_ARB ) == GL11.GL_FALSE)
       {
         ARBShaderObjects.glDeleteObjectARB( vertShader );
         System.out.println( getLogInfo( vertShader ) );

         return;
       }

       fragShader = ARBShaderObjects.glCreateShaderObjectARB( ARBFragmentShader.GL_FRAGMENT_SHADER_ARB );

       if (fragShader == 0)
       {
         return;
       }

       ARBShaderObjects.glShaderSourceARB( fragShader, fs );
       ARBShaderObjects.glCompileShaderARB( fragShader );

       if (ARBShaderObjects.glGetObjectParameteriARB( fragShader, ARBShaderObjects.GL_OBJECT_COMPILE_STATUS_ARB ) == GL11.GL_FALSE)
       {
         ARBShaderObjects.glDeleteObjectARB( vertShader );
         ARBShaderObjects.glDeleteObjectARB( fragShader );
         System.out.println( getLogInfo( fragShader ) );

         return;
       }

       shader = ARBShaderObjects.glCreateProgramObjectARB();

       if (shader == 0)
       {
         return;
       }

       ARBShaderObjects.glAttachObjectARB( shader, vertShader );
       ARBShaderObjects.glAttachObjectARB( shader, fragShader );
       ARBShaderObjects.glLinkProgramARB( shader );

       if (ARBShaderObjects.glGetObjectParameteriARB( shader, ARBShaderObjects.GL_OBJECT_LINK_STATUS_ARB ) == GL11.GL_FALSE)
       {
         ARBShaderObjects.glAttachObjectARB( shader, vertShader );
         ARBShaderObjects.glAttachObjectARB( shader, fragShader );
         System.out.println( getLogInfo( shader ) );
          
         return;
       }

       ARBShaderObjects.glValidateProgramARB( shader );

       if (ARBShaderObjects.glGetObjectParameteriARB( shader, ARBShaderObjects.GL_OBJECT_VALIDATE_STATUS_ARB ) == GL11.GL_FALSE)
       {
         ARBShaderObjects.glAttachObjectARB( shader, vertShader );
         ARBShaderObjects.glAttachObjectARB( shader, fragShader );
         System.out.println( getLogInfo( shader ) );

         return;
       }

       shaders.put( shaderName, shader );
     }
   }

   public void destroyAll()
   {
     for (Map.Entry<String, Integer> entry : shaders.entrySet())
     {
       ARBShaderObjects.glDeleteObjectARB( entry.getValue() );
     }
   }

   public int getShader( String shaderName )
   {
     return shaders.get( shaderName );
   }

   public void bind( String shaderName )
   {
     ARBShaderObjects.glUseProgramObjectARB( shaders.get( shaderName ) );
   }

   public void unbind()
   {
     ARBShaderObjects.glUseProgramObjectARB(0);
   }

   public int getLocation( String shaderName, String valueName )
   {
     bind( shaderName );
     int location = -1;
     location = ARBShaderObjects.glGetUniformLocationARB( shaders.get( shaderName ), valueName );
     unbind();

     return location;
   }

   public void setUniformValue1f( String shaderName, String valName, float value )
   {
     if (!shaders.containsKey( shaderName ))
     {
       return;
     }

     int location = getLocation( shaderName, valName );

     if (location > -1)
     {
       bind( shaderName );
       ARBShaderObjects.glUniform1fARB( location, value );
       unbind();
     }
   }

   public void setUniformValue2f( String shaderName, String valName, float value1, float value2 )
   {
     if (!shaders.containsKey( shaderName ))
     {
       return;
     }

     int location = getLocation( shaderName, valName );

     if (location > -1)
     {
       bind( shaderName );
       ARBShaderObjects.glUniform2fARB( location, value1, value2 );
       unbind();
     }
   }

   public void setUniformValue3f( String shaderName, String valName, float value1, float value2, float value3 )
   {
     if (!shaders.containsKey( shaderName ))
     {
       return;
     }

     int location = getLocation( shaderName, valName );

     if (location > -1)
     {
       bind( shaderName );
       ARBShaderObjects.glUniform3fARB( location, value1, value2, value3 );
       unbind();
     }
   }

   public void setUniformValue4f( String shaderName, String valName, float value1, float value2, float value3, float value4 )
   {
     if (!shaders.containsKey( shaderName ))
     {
       return;
     }

     int location = getLocation( shaderName, valName );

     if (location > -1)
     {
       bind( shaderName );
       ARBShaderObjects.glUniform4fARB( location, value1, value2, value3, value4 );
       unbind();
     }
   }

   public void setUniformValue1i( String shaderName, String valName, int value )
   {
     if (!shaders.containsKey( shaderName ))
     {
       return;
     }

     int location = getLocation( shaderName, valName );

     if (location > -1)
     {
       bind( shaderName );
       ARBShaderObjects.glUniform1iARB( location, value );
       unbind();
     }
   }

   public void setUniformValue2i( String shaderName, String valName, int value1, int value2 )
   {
     if (!shaders.containsKey( shaderName ))
     {
       return;
     }

     int location = getLocation( shaderName, valName );

     if (location > -1)
     {
       bind( shaderName );
       ARBShaderObjects.glUniform2iARB( location, value1, value2 );
       unbind();
     }
   }

   public void setUniformValue3i( String shaderName, String valName, int value1, int value2, int value3 )
   {
     if (!shaders.containsKey( shaderName ))
     {
       return;
     }

     int location = getLocation( shaderName, valName );

     if (location > -1)
     {
       bind( shaderName );
       ARBShaderObjects.glUniform3iARB( location, value1, value2, value3 );
       unbind();
     }
   }

   public void setUniformValue4i( String shaderName, String valName, int value1, int value2, int value3, int value4 )
   {
     if (!shaders.containsKey( shaderName ))
     {
       return;
     }

     int location = getLocation( shaderName, valName );

     if (location > -1)
     {
       bind( shaderName );
       ARBShaderObjects.glUniform4iARB( location, value1, value2, value3, value4 );
       unbind();
     }
   }

   public void setUniformMatrix2fv( String shaderName, String valName, boolean bol, FloatBuffer pVal )
   {
     if (!shaders.containsKey( shaderName ))
     {
       return;
     }

     int location = getLocation( shaderName, valName );

     if (location > -1)
     {
       bind( shaderName );
       ARBShaderObjects.glUniformMatrix2ARB( location, bol, pVal );
       unbind();
     }
   }

   public void setUniformMatrix3fv( String shaderName, String valName, boolean bol, FloatBuffer pVal )
   {
     if (!shaders.containsKey( shaderName ))
     {
       return;
     }

     int location = getLocation( shaderName, valName );

     if (location > -1)
     {
       bind( shaderName );
       ARBShaderObjects.glUniformMatrix3ARB( location, bol, pVal );
       unbind();
     }
   }

   public void setUniformMatrix4fv( String shaderName, String valName, boolean bol, FloatBuffer pVal )
   {
     if (!shaders.containsKey( shaderName ))
     {
       return;
     }

     int location = getLocation( shaderName, valName );

     if (location > -1)
     {
       bind( shaderName );
       ARBShaderObjects.glUniformMatrix4ARB( location, bol, pVal );
       unbind();
     }
   }
}


Не следует обманывать инспектора
Pipmak Assistant
Love2D Exporter
Love2D-Helpers
Old Consoles Games
ArchidoДата: Четверг, 28 Марта 2013, 08:43 | Сообщение # 3
Сэнсэй
Сейчас нет на сайте
LWJGL - фактически самый обычный OpenGL, поэтому туториалы лучше смотреть вообще любые, без привязки к конкретному языку. По GLSL существует весьма недурная книженция - Orange Book, лучше материала наверное вообще нет.

C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Четверг, 28 Марта 2013, 08:44
MDKedДата: Четверг, 11 Апреля 2013, 13:25 | Сообщение # 4
частый гость
Сейчас нет на сайте
Если кому интересно, могу поделиться своими опытами в реализации GLSL на Slick2D.

Стою на асфальте я в лыжи обутый.
То ли лыжи не едут, то ли я баганутый.
"O-Wars"
Форум игроделов » Программирование » Общие обсуждения программистов » GLSL (OpenGL Shading Language)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг