문제
셰이더를 사용하여 구체에 많은 원을 그리려고합니다. 기본 alogrith는 다음과 같습니다.
- 단편 (텍스처 좌표 사용)에서 원의 중심 위치까지의 거리를 계산합니다 (원의 중심은 텍스처 좌표에도 지정됨)
- 크로스티에서 원의 중심까지 각도를 계산하십시오.
- 각도에 따라 텍스처에 액세스하고 (360 픽셀이 있고 빨간색 채널은 반경 거리를 지정하고) 주어진 각도의 반경을 검색합니다.
- 단편에서 원의 중심까지의 거리는 검색된 반경보다 낮 으면 조각의 색상은 빨간색입니다.
나는 푸른 구체에 60 개의 빨간색 서클을 말하고 싶다. 나는 y 셰이더가 하나의 원을 위해 일할 수 있었지만 60을하는 방법은 무엇입니까? 내가 지금까지 시도한 것입니다 ....
주어진 각도에 대한 반경을 지정하는 데이터 텍스처를 통과했지만 아티팩트가 들어온 것을 알 수 있습니다. 나는 이것이 다음을 사용하여 데이터 텍스처에서 정보를 검색하려고 할 때 선형 보간 때문이라고 생각합니다.
float returnV = texture2D(angles, vec2(x, y)).r;
여기서 각도는 주어진 각도에 대한 반경을 포함하는 데이터 텍스처 (샘플러 2D)이고 x = 각도 / 360.0 (각도는 0 ~ 360)이고 y = 0 ~ 60 (y는 원 숫자)입니다.
균일 한 플로트 반경을 통과하려고 시도했지만 [360], 동적 인덱싱으로 반경에 액세스 할 수 없습니다. 나는 심지어이 혼란을 시도했다 ...
getArrayValue(int index) { if (index == 0) { return radii[0]; } else if (index == 1) { return radii[1]; }
등등 ...
텍스처를 만들고 그 질감에 모든 원을 배치 한 다음 해당 원형을 텍스트로 텍스트에 넣으면 서클이 들어있는 원과 함께 파란색 구체를 텍스트에 텍스트에 텍스트하지만 예상대로 별명이 나쁘다. 나는 거의 별명이 없기 때문에 조각의 위치와 원의 위치에 따라 원을 생성하는 절차 적 아이디어를 좋아합니다. 그러나 나는 하나보다 광석을 하는가?
고마워!!!
~ 볼트
해결책
지형에 원을 만드는 셰이더가 있습니다. 마우스 움직임으로 움직입니다. 영감을 얻을 수 있을까요?
이것은 조각 프로그램입니다. 주요 프로그램은 아니지만 프로그램에 추가 할 수 있습니다. 이 시도...
지금은 하드 코드에서 균일 한 매개 변수를 제공 할 수 있습니다.
uniform float showCircle;
uniform float radius;
uniform vec4 mousePosition;
varying vec3 vertexCoord;
void calculateTerrainCircle(inout vec4 pixelColor)
{
if(showCircle == 1)
{
float xDist = vertexCoord.x - mousePosition.x;
float yDist = vertexCoord.y - mousePosition.y;
float dist = xDist * xDist + yDist * yDist;
float radius2 = radius * radius;
if (dist < radius2 * 1.44f && dist > radius2 * 0.64f)
{
vec4 temp = pixelColor;
float diff;
if (dist < radius2)
diff = (radius2 - dist) / (0.36f * radius2);
else
diff = (dist - radius2) / (0.44f * radius2);
pixelColor = vec4(1, 0, 0, 1.0) * (1 - diff) + pixelColor * diff;
pixelColor = mix(pixelColor, temp, diff);
}
}
}
그리고 Vertex Shader에서 당신은 다음을 추가합니다.
varying vec3 vertexCoord;
void main()
{
gl_Position = ftransform();
vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex);
vertexCoord = vec3(gl_ModelViewMatrixInverse * v);
}
다른 팁
Ufukgun, 당신이 그 역수에 의해 매트릭스를 다중으로한다면, 당신은 정체성을 얻습니다.
당신의;
vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex);
vertexCoord = vec3(gl_ModelViewMatrixInverse * v);
따라서와 같습니다
vertexCoord = vec3(gl_Vertex);