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"
|
|
| |