Method: RGSS::Shader#initialize
- Defined in:
- lib/rgss/shader.rb
#initialize(vertex, fragment, geometry = nil) ⇒ Shader
Returns a new instance of Shader.
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/rgss/shader.rb', line 11 def initialize(vertex, fragment, geometry = nil) super(glCreateProgram) raise(ArgumentError, 'vertex source cannot be nil') unless vertex raise(ArgumentError, 'fragment source cannot be nil') unless fragment v = compile(GL_VERTEX_SHADER, vertex) f = compile(GL_FRAGMENT_SHADER, fragment) g = geometry ? compile(GL_GEOMETRY_SHADER, geometry) : 0 glAttachShader(self.id, v) glAttachShader(self.id, f) glAttachShader(self.id, g) if g > 0 glLinkProgram(self.id) [v, f, g].each do |shader| next if shader.zero? glDetachShader(self.id, shader) glDeleteShader(shader) end buffer = "\0" * SIZEOF_INT glGetProgramiv(self.id, GL_LINK_STATUS, buffer) return if buffer.unpack1('i') == GL_TRUE glGetProgramiv(self.id, GL_INFO_LOG_LENGTH, buffer) length = buffer.unpack1('i') = "\0" * length glGetProgramInfoLog(self.id, lengh, buffer, ) raise(RuntimeError, "failed to link shader program: #{message}") index = glGetUniformBlockIndex(self.id, 'ortho') glUniformBlockBinding(@id, index, 0) if index >= 0 p index if block_given? yield self dispose end end |