2012-04-13 13 views
9

मैं एक एक्सएनए/एचएलएसएल पृष्ठभूमि से आने वाले libgdx का उपयोग करके शेडर्स को समझने की कोशिश कर रहा हूं। मैं बिना किसी शेडर के आउटपुट को पुन: उत्पन्न करने के लिए एक ऊर्ध्वाधर/टुकड़ा शेडर जोड़ी प्राप्त करने की कोशिश कर रहा हूं, लेकिन यह कुछ भी प्रदर्शित नहीं कर रहा है।libgdx शेडर्स- मूल शेडर, लेकिन स्क्रीन खाली है

छायांकर्ता निर्माण:

void SetupShader() 
{ 
    ShaderProgram.pedantic = false; 
    shader = new ShaderProgram(
      Gdx.files.internal("assets/default.vert").readString(), 
      Gdx.files.internal("assets/default.frag").readString()); 
    if(!shader.isCompiled()) { 
     Gdx.app.log("Problem loading shader:", shader.getLog()); 
    } 
    batch.setShader(shader); 
} 

default.vert:

attribute vec4 a_Position; 
attribute vec4 a_Normal; 
attribute vec2 a_TexCoord; 
attribute vec4 a_Color; 

uniform mat4 u_projTrans; 

varying vec2 v_texCoords; 
varying vec4 v_color; 

void main() { 
    v_color = a_Color; 
    v_texCoords = a_TexCoord; 
    gl_Position = u_projTrans * a_Position; 
} 

default.frag:

#ifdef GL_ES 
precision mediump float; 
#endif 

varying vec2 v_texCoords; 
varying vec4 v_color; 

void main() { 
    gl_FragColor = v_color; 
} 

प्रतिपादन:

batch.begin(); 
for (GameObject gObj : gameObjects) 
    gObj.Draw(batch); 
batch.end(); 

यहाँ कोई सुझाव? मैं ओपनजीएल-ईएस के लिए भी नया हूं, इसलिए मुझे कुछ स्पष्ट याद आ रही है। मैंने पोस्टिंग से पहले थोड़ा सा देखा, और SpriteBatch.setShader(ShaderProgram) के लिए डॉक्टर निम्नानुसार था:

एक GLES 2.0 वातावरण में शेडर का उपयोग करने के लिए सेट करता है। Vertex स्थिति विशेषता को "a_position" कहा जाता है, बनावट गुणांक विशेषता कहलाती है जिसे "a_texCoords0" कहा जाता है, रंग विशेषता को "a_color" कहा जाता है। ShaderProgram.POSITION_ATTRIBUTE, ShaderProgram.COLOR_ATTRIBUTE और शेडरप्रोग्राम.टेक्सकोर्ड_एटीटीआरबीयूटीई देखें जो पर लगाए गए "0" को पहले बनावट इकाई का उपयोग इंगित करता है। प्रक्षेपण मैट्रिक्स, एक mat4 वर्दी "u_proj" कहा जाता है के माध्यम से अपलोड है बदलने मैट्रिक्स , एक समान "u_trans" कहा जाता है के माध्यम से अपलोड की गई है संयुक्त बदलने और प्रक्षेपण matrx एक mat4 वर्दी "u_projTrans" कहा जाता है के माध्यम से अपलोड किया जाता है। बनावट नमूना "u_texture" नामक वर्दी के माध्यम से पारित किया जाता है। डिफ़ॉल्ट शेडर का उपयोग करने के लिए इस विधि को शून्य तर्क के साथ कॉल करें।

+2

हम्म, GLSL कल्पना में शामिल है: 'सामान्य तौर पर, की भाषा का उपयोग यह चरित्र सेट केस संवेदनशील है। क्या इसका मतलब है पहचानकर्ता मामले संवेदनशील हैं? पहचानकर्ता अनुभाग में इसके बारे में कोई शब्द नहीं है। (कशेरुक शेडर में 'a_Position', टिप्पणी' a_position') –

+0

हाँ, ऐसा लगता है कि आप सही थे। मैंने जांच की कि 'स्प्राइटबैच' कैसे अपने शेडर बनाता है, और यह मुख्य रूप से एक कैप्स मुद्दा था। मैंने यह भी पता लगाया कि डिफ़ॉल्ट शेडर्स क्या हैं- मैं नीचे उनको पोस्ट करूंगा। – NumberOverZero

उत्तर

12

SpriteBatch में कोड को देखने के बाद ऐसा लगता है कि मेरे कोड में कुछ गलतियां थीं। नीचे सही shaders हैं:

default.vert:

attribute vec4 a_position; 
attribute vec4 a_color; 
attribute vec2 a_texCoord0; 

uniform mat4 u_projTrans; 

varying vec4 v_color; 
varying vec2 v_texCoords; 

void main() { 
    v_color = a_color; 
    v_texCoords = a_texCoord0; 
    gl_Position = u_projTrans * a_position; 
} 

default.frag:

#ifdef GL_ES 
    precision mediump float; 
#endif 

varying vec4 v_color; 
varying vec2 v_texCoords; 
uniform sampler2D u_texture; 

void main() { 
    gl_FragColor = v_color * texture2D(u_texture, v_texCoords); 
} 
+1

यह कारण भी है कि यह ट्यूटोरियल टूटा हुआ है: https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson1 –

संबंधित मुद्दे