2016-03-03 138 views
0

我試圖在場景上疊加一些TextVisuals,但我無法正確顯示所有內容。這裏是我的代碼是slightlty從vispy例如here在Vispy中使用視覺效果與gloo着色器程序

import numpy as np 

from vispy import app, gloo, visuals 
from vispy.gloo import Program, VertexBuffer, IndexBuffer 
from vispy.util.transforms import perspective, translate, rotate 
from vispy.geometry import create_cube 


vertex = """ 
uniform mat4 model; 
uniform mat4 view; 
uniform mat4 projection; 
attribute vec3 position; 
attribute vec2 texcoord; 
attribute vec3 normal; 
attribute vec4 color; 
varying vec4 v_color; 
void main() 
{ 
    v_color = color; 
    gl_Position = projection * view * model * vec4(position,1.0); 
} 
""" 

fragment = """ 
varying vec4 v_color; 
void main() 
{ 
    gl_FragColor = v_color; 
} 
""" 

vertexcb = """ 
attribute vec2 position; 
void main() 
{ 
    gl_Position = vec4(position, 0.0, 1.0); 
} 

""" 

fragmentcb = """ 
uniform vec2 screen; 

void main() 
{ 
    float color = (gl_FragCoord.x-0.1*screen.x)/(0.8*screen.x); 
    gl_FragColor = vec4(0.0416+max(min(2.625106*color,0.9584),0),max(min(2.624996*color-0.958331,1),0),0.1+max(min(3.937504*color-2.937504,0.9),0),0); 
} 
""" 

class Canvas(app.Canvas): 
    def __init__(self): 
     app.Canvas.__init__(self, size=(800, 600), title='Colored cube', 
          keys='interactive') 

     # Build cube data 
     V, I, _ = create_cube() 
     vertices = VertexBuffer(V) 
     self.indices = IndexBuffer(I) 

     # Build program 
     self.program = Program(vertex, fragment) 
     self.program.bind(vertices) 

     # Build view, model, projection & normal 
     view = translate((0, 0, -5)) 
     model = np.eye(4, dtype=np.float32) 
     self.program['model'] = model 
     self.program['view'] = view 
     self.phi, self.theta = 0, 0 

     # Add colorbar 
     self.programcb = Program(vertexcb, fragmentcb) 
     self.programcb['screen'] = self.physical_size   
     self.programcb['position'] = [[-0.8, -0.8],[-0.8,-0.6],[0.8,-0.8],[0.8,-0.6]] 
     self.indicescb = IndexBuffer([[0,1,2],[1,2,3]]) 

     # Add text 
     self.testText = visuals.TextVisual('Testy',pos=(20,20)) 
     self.tr_sys = visuals.transforms.TransformSystem(self) 

     gloo.set_state(clear_color=(0.30, 0.30, 0.35, 1.00), depth_test=True) 

     self.activate_zoom() 

     self.timer = app.Timer('auto', self.on_timer, start=True) 

     self.show() 

    def on_draw(self, event): 
     gloo.clear(color=True, depth=True) 
     self.testText.draw(self.tr_sys) #draw text 
     self.program.draw('triangles', self.indices) #draw the cube 
     self.programcb.draw('triangles', self.indicescb) # draw the colorbar 


    def on_resize(self, event): 
     self.activate_zoom() 

    def activate_zoom(self): 
     gloo.set_viewport(0, 0, *self.physical_size) 
     self.programcb['screen'] = self.physical_size 
     projection = perspective(45.0, self.size[0]/float(self.size[1]), 
           2.0, 10.0) 
     self.program['projection'] = projection 

    def on_timer(self, event): 
     self.theta += .5 
     self.phi += .5 
     self.program['model'] = np.dot(rotate(self.theta, (0, 0, 1)), 
             rotate(self.phi, (0, 1, 0))) 
     self.update() 

if __name__ == '__main__': 
    c = Canvas() 
    app.run() 

這將產生一個旋轉的立方體和文本的場景修改,但顏色條丟失。此外,立方體的一些面只顯示該三角形的內部。當我從on_draw方法中刪除self.testText.draw(self.tr_sys)時,colorbar和cube都正確顯示。如果我註釋掉多維數據集圖並留下顏色條和文字圖,我只能看到文字。

這裏發生了什麼? TransformSystem是否以某種方式改變了彩條的位置,VertexBuffer知道如何處理,以便立方體仍然顯示?與立方體和顏色條相比,代碼在顯示文本和破碎立方體時的速度也慢得多。文字繪圖是否改變了一些導致速度變慢的OpenGL設置?

這裏什麼也沒有現場註釋掉 scene with text

現場沒有文字 without text

回答

0

文本渲染代碼可能是禁用深度測試和多維數據集的繪圖代碼不(再)啓用它。

gloo.set_state(clear_color=(0.30, 0.30, 0.35, 1.00), depth_test=True) 

確實使深度測試,但它只是在構造函數中設置。這是一個重要的規則(與我交談):OpenGL中沒有「初始化」。只有在需要時才需要設置狀態。收藏此

權前的立方體三角形繪製代碼,即

高清on_draw(個體經營,事件): gloo.clear(顏色=真,深度= TRUE) self.testText.draw(self.tr_sys )#draw text

gloo.set_state(depth_test=True) 
    self.program.draw('triangles', self.indices) #draw the cube 
+0

謝謝,這固定了立方體,但顏色條仍然丟失。文本渲染代碼是否會添加一些額外的投影,將顏色條移出視圖?如果是,我該如何恢復? – Odingod