Friday, 15 January 2010

opengl - Java crashes when loading shader -



opengl - Java crashes when loading shader -

(ooh, question got on email list of "new lwjgl questions" - awesome)

i trying load shaders.

but when do, java crashes:

# # fatal error has been detected java runtime environment: # # exception_access_violation (0xc0000005) @ pc=0x073af8f2, pid=17240, tid=16060 # # jre version: java(tm) se runtime environment (7.0_51-b13) (build 1.7.0_51-b13) # java vm: java hotspot(tm) client vm (24.51-b03 mixed mode, sharing windows-x86 ) # problematic frame: # c [ig7icd32.dll+0x3df8f2] # # failed write core dump. minidumps not enabled default on client versions of windows # # error study file more info saved as: # d:\downloads\mcp\ship\ship\hs_err_pid17240.log # # if submit bug report, please visit: # http://bugreport.sun.com/bugreport/crash.jsp # crash happened outside java virtual machine in native code. # see problematic frame study bug. #

i pastebinned .log folder @ http://pastebin.com/jnnd4ubi. relevant bit is:

java frames: (j=compiled java code, j=interpreted, vv=vm code) j org.lwjgl.opengl.gl20.ngllinkprogram(ij)v+0 j org.lwjgl.opengl.gl20.gllinkprogram(i)v+15 j utility.shaderloader.loadshaderpair(ljava/lang/string;ljava/lang/string;ljava/lang/string;ljava/lang/s tring;)i+887 j joehot200.terraindemo.setupshaders()v+12 j joehot200.terraindemo.startgame()v+43 j startscreenexperiments.test2.resarttdemo()v+21 j startscreenexperiments.test2.main([ljava/lang/string;)v+10 v ~stubroutines::call_stub

so relevant part "gllinkprogram", showing crash occurring when effort link already-compiled shaders.

my loadshaderpair() method contains following:

public static int loadshaderpair(string vertexshaderlocation, string fragmentshaderlocation, string tesshaderlocation, string tesscontrolshaderlocation) { int shaderprogram = glcreateprogram(); int vertexshader = glcreateshader(gl_vertex_shader); int fragmentshader = glcreateshader(gl_fragment_shader); int tesscontrolshader = glcreateshader(gl40.gl_tess_control_shader); int tesshader = glcreateshader(gl40.gl_tess_evaluation_shader); stringbuilder vertexshadersource = new stringbuilder(); stringbuilder fragmentshadersource = new stringbuilder(); stringbuilder tesshadersource = new stringbuilder(); stringbuilder tesscontrolshadersource = new stringbuilder(); bufferedreader tesshaderfilereader = null; seek { tesshaderfilereader = new bufferedreader(new filereader(tesshaderlocation)); string line; while ((line = tesshaderfilereader.readline()) != null) { tesshadersource.append(line).append('\n'); } } grab (ioexception e) { e.printstacktrace(); homecoming -1; } { if (tesshaderfilereader != null) { seek { tesshaderfilereader.close(); } grab (ioexception e) { e.printstacktrace(); } } } bufferedreader tesscontrolshaderfilereader = null; seek { tesscontrolshaderfilereader = new bufferedreader(new filereader(tesscontrolshaderlocation)); string line; while ((line = tesscontrolshaderfilereader.readline()) != null) { tesscontrolshadersource.append(line).append('\n'); } } grab (ioexception e) { e.printstacktrace(); homecoming -1; } { if (tesscontrolshaderfilereader != null) { seek { tesscontrolshaderfilereader.close(); } grab (ioexception e) { e.printstacktrace(); } } } bufferedreader vertexshaderfilereader = null; seek { vertexshaderfilereader = new bufferedreader(new filereader(vertexshaderlocation)); string line; while ((line = vertexshaderfilereader.readline()) != null) { vertexshadersource.append(line).append('\n'); } } grab (ioexception e) { e.printstacktrace(); homecoming -1; } { if (vertexshaderfilereader != null) { seek { vertexshaderfilereader.close(); } grab (ioexception e) { e.printstacktrace(); } } } bufferedreader fragmentshaderfilereader = null; seek { fragmentshaderfilereader = new bufferedreader(new filereader(fragmentshaderlocation)); string line; while ((line = fragmentshaderfilereader.readline()) != null) { fragmentshadersource.append(line).append('\n'); } } grab (ioexception e) { e.printstacktrace(); homecoming -1; } { if (fragmentshaderfilereader != null) { seek { fragmentshaderfilereader.close(); } grab (ioexception e) { e.printstacktrace(); } } } glshadersource(vertexshader, vertexshadersource); glcompileshader(vertexshader); system.out.println(glgetshaderi(vertexshader, gl_compile_status) == gl11.gl_true); if (glgetshaderi(vertexshader, gl_compile_status) == gl_false) { system.err.println("vertex shader wasn't able compiled correctly. error log:"); //try{ system.err.println(glgetshaderinfolog(vertexshader, 1024)); homecoming -1; } glshadersource(tesscontrolshader, tesscontrolshadersource); glcompileshader(tesscontrolshader); system.out.println(glgetshaderi(tesscontrolshader, gl_compile_status) == gl11.gl_true); if (glgetshaderi(tesscontrolshader, gl_compile_status) == gl_false) { system.err.println("tesscontrol shader wasn't able compiled correctly. error log:"); system.err.println(gl11.glgetstring(gl11.glgeterror())); system.err.println(glgetshaderinfolog(tesscontrolshader, 1024)); } glshadersource(fragmentshader, fragmentshadersource); glcompileshader(fragmentshader); system.out.println(glgetshaderi(fragmentshader, gl_compile_status) == gl11.gl_true); if (glgetshaderi(fragmentshader, gl_compile_status) == gl_false) { system.err.println("fragment shader wasn't able compiled correctly. error log:"); system.err.println(gl11.glgetstring(gl11.glgeterror())); system.err.println(glgetshaderinfolog(fragmentshader, 1024)); } glshadersource(tesshader, tesshadersource); glcompileshader(tesshader); system.out.println(glgetshaderi(tesshader, gl_compile_status) == gl11.gl_true); if (glgetshaderi(tesshader, gl_compile_status) == gl_false) { system.err.println("tessellation shader wasn't able compiled correctly. error log:"); system.err.println(glgetshaderinfolog(tesshader, 1024)); homecoming -1; } glattachshader(shaderprogram, vertexshader); glattachshader(shaderprogram, tesshader); glattachshader(shaderprogram, tesscontrolshader); glattachshader(shaderprogram, fragmentshader); gllinkprogram(shaderprogram); system.err.println(glgetprograminfolog(shaderprogram, 1024)); if (glgetprogrami(shaderprogram, gl_link_status) == gl_false) { system.err.println("shader programme wasn't linked correctly."); system.err.println(gl11.glgetstring(gl11.glgeterror())); system.exit(1); homecoming -1; } gldeleteshader(vertexshader); gldeleteshader(fragmentshader); gldeleteshader(tesshader); gldeleteshader(tesscontrolshader); homecoming shaderprogram; }

my vertex shader this:

layout(triangles, equal_spacing, ccw) in; uniform mat4 gvp; uniform sampler2d gdisplacementmap; uniform float gdispfactor; in vec3 worldpos_es_in[]; in vec2 texcoord_es_in[]; in vec3 normal_es_in[]; out vec3 worldpos_fs_in; out vec2 texcoord_fs_in; out vec3 normal_fs_in; vec2 interpolate2d(vec2 v0, vec2 v1, vec2 v2) { homecoming vec2(gl_tesscoord.x) * v0 + vec2(gl_tesscoord.y) * v1 + vec2(gl_tesscoord.z) * v2; } vec3 interpolate3d(vec3 v0, vec3 v1, vec3 v2) { homecoming vec3(gl_tesscoord.x) * v0 + vec3(gl_tesscoord.y) * v1 + vec3(gl_tesscoord.z) * v2; } void main() { // interpolate attributes of output vertex using barycentric coordinates texcoord_fs_in = interpolate2d(texcoord_es_in[0], texcoord_es_in[1], texcoord_es_in[2]); normal_fs_in = interpolate3d(normal_es_in[0], normal_es_in[1], normal_es_in[2]); normal_fs_in = normalize(normal_fs_in); worldpos_fs_in = interpolate3d(worldpos_es_in[0], worldpos_es_in[1], worldpos_es_in[2]); // displace vertex along normal float displacement = texture(gdisplacementmap, texcoord_fs_in.xy).x; worldpos_fs_in += normal_fs_in * displacement * gdispfactor; gl_position = gvp * vec4(worldpos_fs_in, 1.0); }

tessellation command shader:

// define number of cps in output patch layout (vertices = 3) out; uniform vec3 geyeworldpos; // attributes of input cps in vec3 worldpos_cs_in[]; in vec2 texcoord_cs_in[]; in vec3 normal_cs_in[]; // attributes of output cps out vec3 worldpos_es_in[]; out vec2 texcoord_es_in[]; out vec3 normal_es_in[]; float gettesslevel(float distance0, float distance1) { float avgdistance = (distance0 + distance1) / 2.0; if (avgdistance <= 2.0) { homecoming 10.0; } else if (avgdistance <= 5.0) { homecoming 7.0; } else { homecoming 3.0; } } void main() { // set command points of output patch texcoord_es_in[gl_invocationid] = texcoord_cs_in[gl_invocationid]; normal_es_in[gl_invocationid] = normal_cs_in[gl_invocationid]; worldpos_es_in[gl_invocationid] = worldpos_cs_in[gl_invocationid]; // calculate distance photographic camera 3 command points float eyetovertexdistance0 = distance(geyeworldpos, worldpos_es_in[0]); float eyetovertexdistance1 = distance(geyeworldpos, worldpos_es_in[1]); float eyetovertexdistance2 = distance(geyeworldpos, worldpos_es_in[2]); // calculate tessellation levels gl_tesslevelouter[0] = gettesslevel(eyetovertexdistance1, eyetovertexdistance2); gl_tesslevelouter[1] = gettesslevel(eyetovertexdistance2, eyetovertexdistance0); gl_tesslevelouter[2] = gettesslevel(eyetovertexdistance0, eyetovertexdistance1); gl_tesslevelinner[0] = gl_tesslevelouter[2]; }

tessellation evaluation shader:

layout(triangles, equal_spacing, ccw) in; uniform mat4 gvp; uniform sampler2d gdisplacementmap; uniform float gdispfactor; in vec3 worldpos_es_in[]; in vec2 texcoord_es_in[]; in vec3 normal_es_in[]; out vec3 worldpos_fs_in; out vec2 texcoord_fs_in; out vec3 normal_fs_in; vec2 interpolate2d(vec2 v0, vec2 v1, vec2 v2) { homecoming vec2(gl_tesscoord.x) * v0 + vec2(gl_tesscoord.y) * v1 + vec2(gl_tesscoord.z) * v2; } vec3 interpolate3d(vec3 v0, vec3 v1, vec3 v2) { homecoming vec3(gl_tesscoord.x) * v0 + vec3(gl_tesscoord.y) * v1 + vec3(gl_tesscoord.z) * v2; } void main() { // interpolate attributes of output vertex using barycentric coordinates texcoord_fs_in = interpolate2d(texcoord_es_in[0], texcoord_es_in[1], texcoord_es_in[2]); normal_fs_in = interpolate3d(normal_es_in[0], normal_es_in[1], normal_es_in[2]); normal_fs_in = normalize(normal_fs_in); worldpos_fs_in = interpolate3d(worldpos_es_in[0], worldpos_es_in[1], worldpos_es_in[2]); // displace vertex along normal float displacement = texture(gdisplacementmap, texcoord_fs_in.xy).x; worldpos_fs_in += normal_fs_in * displacement * gdispfactor; gl_position = gvp * vec4(worldpos_fs_in, 1.0); }

fragment shader:

varying vec4 position_in_view_space; uniform sampler2d color_texture; void main() { float dist = distance(position_in_view_space, vec4(0.0, 0.0, 0.0, 1.0)); if (dist < 1000.0) { gl_fragcolor = gl_color; // color near origin } else { gl_fragcolor = gl_color; //kill; //discard; //gl_fragcolor = vec4(0.3, 0.3, 0.3, 1.0); // color far origin } }

i cannot work out wrong. know issue shaders beingness linked cannot find why crash java when linked, or how prepare it.

would great if them working expected (expected beingness farther away objects given less vertices).

java opengl glsl lwjgl

No comments:

Post a Comment