2010-06-22 24 views
5

Tôi đang cố gắng viết một chương trình thay thế khá đơn giản.câu hỏi về việc chuyển đổi chương trình đổ bóng (ES 2)

Tôi có hai trình đổ bóng khác nhau, một hình mờ hiển thị hình chữ nhật màu cho màn hình, hình kia hiển thị hình chữ nhật được vẽ bản đồ kết cấu.

Trước tiên, tôi muốn vẽ hình chữ nhật màu đồng nhất, sau đó trên cùng, vẽ hình chữ nhật được vẽ bản đồ kết cấu.

glUseProgram(program1); 
    glUniform1f(shader1_uniforms[UNIFORM_SCREEN_WIDTH], (GLfloat)screenWidth); 
    glUniform1f(shader1_uniforms[UNIFORM_SCREEN_HEIGHT], (GLfloat)screenHeight); 

    glDisableVertexAttribArray(ATTRIB_TEX2); 

    glVertexAttribPointer(ATTRIB_VERTEX2, 2, GL_FLOAT, 0, 0, squareVertices); 
    glEnableVertexAttribArray(ATTRIB_VERTEX2); 
    glVertexAttribPointer(ATTRIB_COLOR2, 4, GL_FLOAT, 1, 0, squareColors); 
    glEnableVertexAttribArray(ATTRIB_COLOR2); 


    glDrawArrays(GL_TRIANGLE_STRIP,0,4); 


    glEnable(GL_BLEND); 
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

    glBindTexture(GL_TEXTURE_2D,1); 




    glUseProgram(program2); 
    glUniform1f(shader2_uniforms[UNIFORM_SCREEN_WIDTH], (GLfloat)screenWidth); 
    glUniform1f(shader2_uniforms[UNIFORM_SCREEN_HEIGHT], (GLfloat)screenHeight); 
    glUniform1i(shader2_uniforms[UNIFORM_UIMAP], 0); 



    glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices); 
    glEnableVertexAttribArray(ATTRIB_VERTEX); 
    glVertexAttribPointer(ATTRIB_COLOR, 4, GL_FLOAT, 1, 0, squareColors); 
    glEnableVertexAttribArray(ATTRIB_COLOR); 
    glVertexAttribPointer(ATTRIB_TEX, 2, GL_FLOAT, 0, 0, squareTexCoords); 
    glEnableVertexAttribArray(ATTRIB_TEX); 

    // Draw 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 


    glDisable(GL_BLEND); 

hai trình tạo bóng hoạt động chính xác, nếu được thực hiện riêng biệt (ví dụ: nhận xét phần bằng cách sử dụng trình đổ bóng đầu tiên). nhưng khi tôi kết hợp chúng với nhau, như trên, bản đồ kết cấu sẽ biến mất. Tôi đã dành khá nhiều thời gian để tìm ra lý do tại sao ...

ai đó có thể giúp tôi không? cảm ơn.

Trả lời

1

Bạn không thể kết hợp các trình đổ bóng theo cách đó, chỉ chương trình cuối cùng được chỉ định bằng glUseProgram mới được sử dụng.

Để kết hợp các trình đổ bóng, bạn phải thực hiện theo cách thủ công tạo trình đổ bóng mới làm cả hai việc cùng một lúc.

+0

Tôi biết đây là một bài đăng rất cũ, nhưng tôi tự hỏi liệu bạn có thể mở rộng câu trả lời này không? Bạn có nghĩa là bạn không thể sử dụng nhiều chương trình đổ bóng, hoặc bạn đang nói rằng nó cần làm theo một cách cụ thể. Tôi đang cố gắng triển khai nhiều trình đổ bóng trong ứng dụng của mình vào lúc này - tôi bắt đầu sử dụng chỉ một ứng dụng nhưng một nhánh trong trình đổ bóng phân đoạn đã làm chậm nghiêm trọng. Cảm ơn – Stuart

+2

@StuDev Có nghĩa là bạn không thể sử dụng nhiều chương trình cùng một lúc, mỗi cuộc gọi đến glUseProgram sẽ thay thế chương trình hiện tại bằng chương trình được chuyển đến hàm. Lưu ý rằng điều này có nghĩa là cùng một lúc, việc vẽ các đối tượng với các chương trình khác nhau sẽ hoạt động mà không có bất kỳ vấn đề gì. –

+0

Ok cảm ơn bạn đã trả lời. Vì vậy, nếu tôi hiểu chính xác, mẫu sau đây sẽ hoạt động ok trong một khung đơn render: 'glUseProgram (prog1)' -> 'glDrawElements()' -> 'glUseProgram (prog2)' -> 'glDrawArrays()' (cho các FBO khác nhau) -> trình bày renderbuffer. Hy vọng tôi đã hiểu điều đó một cách chính xác. – Stuart

0

Tôi tự hỏi nếu glBindTexture() phải xảy ra sau khi chương trình được chuyển đổi với glUseProgram(). Dưới đây là tham chiếu cho glUseProgram this page. Đảm bảo glUseProgram không được gọi giữa glBegin và glEnd. Kiểm tra glGetError để xem nếu có lỗi xảy ra khi tải chương trình đỉnh thứ hai.

Các vấn đề liên quan