문제

셰이더를 사용하여 구체에 많은 원을 그리려고합니다. 기본 alogrith는 다음과 같습니다.

  1. 단편 (텍스처 좌표 사용)에서 원의 중심 위치까지의 거리를 계산합니다 (원의 중심은 텍스처 좌표에도 지정됨)
  2. 크로스티에서 원의 중심까지 각도를 계산하십시오.
  3. 각도에 따라 텍스처에 액세스하고 (360 픽셀이 있고 빨간색 채널은 반경 거리를 지정하고) 주어진 각도의 반경을 검색합니다.
  4. 단편에서 원의 중심까지의 거리는 검색된 반경보다 낮 으면 조각의 색상은 빨간색입니다.

나는 푸른 구체에 60 개의 빨간색 서클을 말하고 싶다. 나는 y 셰이더가 하나의 원을 위해 일할 수 있었지만 60을하는 방법은 무엇입니까? 내가 지금까지 시도한 것입니다 ....

  1. 주어진 각도에 대한 반경을 지정하는 데이터 텍스처를 통과했지만 아티팩트가 들어온 것을 알 수 있습니다. 나는 이것이 다음을 사용하여 데이터 텍스처에서 정보를 검색하려고 할 때 선형 보간 때문이라고 생각합니다.

    float returnV = texture2D(angles, vec2(x, y)).r; 
    

    여기서 각도는 주어진 각도에 대한 반경을 포함하는 데이터 텍스처 (샘플러 2D)이고 x = 각도 / 360.0 (각도는 0 ~ 360)이고 y = 0 ~ 60 (y는 원 숫자)입니다.

  2. 균일 한 플로트 반경을 통과하려고 시도했지만 [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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top