2016-09-24 11 views
0

많은 스프라이트를 렌더링하고 싶습니다. 셰이더를 사용하여 각 스프라이트를 색상으로 무지개 효과로 색칠하고 싶습니다. (스프라이트 텍스처는 초기에는 그레이 스케일로되어 있습니다.)SpriteBatch 및 정점 색상을 사용하여 스프라이트 당 색상을 설정 하시겠습니까?

먼저 유니폼을 사용하여 제가 쉐이더 밖에서 계산 한 색상을 통과 시켰습니다. 그 일은 잘되었지만 너무 느렸다.

그런 다음 프레임마다 여러 번 균일화를 설정했기 때문에 너무 느리다는 것을 알았습니다.

https://gamedev.stackexchange.com/questions/83145/set-color-by-uniform-per-sprite-using-libgdx-spritebatch

[...]는 OpenGL에서 스프라이트 쉽게 버텍스 컬러를 정의하여 수행 할 수 있습니다 염색 : 나는 다음과 같은 발견했다. 이 경우 정점은 SpriteBatch.draw()에 의해 정의되므로 SpriteBatch.setColor()로 색조를 설정해야합니다. [...]

그리고 나는 그렇게하려고 :에

)을 (렌더링 :

 batch.setShader(shader); 
     batch.setColor(.5f, .3f, 1, 1); 
     sprite.draw(batch); 
     batch.setColor(1, 1, 1, 1); 
     batch.setShader(null); 

버텍스 쉐이더 :

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

조각 쉐이더 :

void main() { 
    v_color = a_color*gl_Color*2.0; 
    gl_FragColor = v_color * texture2D(u_texture, v_texCoords); 
} 

좋아, 나는 GLSL 쉐이더에 친숙하지 못하다. 그리고 그것은 아마 이제는 아무 것도 그리지 않는 이유 일 것이다. 나는 뭔가를 놓친 것 같아 무엇을 알아낼 수 없어요.

색상으로 스프라이트의 색조를 조정하려면 어떻게해야합니까? 그래서 그것은 빨리 작동합니까?

+0

사용자 정의 셰이더가 필요하지 않지만 기본 SpriteBatch 셰이더는 이미 색조를 지원합니다. – Xoppa

답변

1

Sprite 클래스와 TextureRegion 클래스에는 큰 차이가 있습니다. Sprite는 자체 정점 데이터를 저장하므로 SpriteBatch 대신 Sprite에서 setColor을 호출하여 색을 지정합니다. 스프라이트는 배치에 설정된 색상을 무시합니다. 반면에 Textures와 TextureRegions는 배치에 설정된 최신 색상을 사용합니다.

또한 프래그먼트 셰이더에서 정점 특성 변수를 사용할 수 없습니다. 버텍스 쉐이더에서 이미 a_colorv_color으로 복사 했으므로 조각 쉐이더에서 v_color을 사용합니다. gl_Color으로 무엇을하려고하는지 잘 모르겠습니다.

+0

감사합니다. – red1575