텍스처 샘플러 2D의 상태를 확인하는 WebGL 셰이더

니콜라 루키 치

셰이더 컴포넌트 (멀티 샘플러 텍스 용)를 준비하고 싶습니다.

현재 상태에서는 2 개의 텍스처 이미지 만 사용 (활성화 및 바인딩)합니다.

하지만이 줄 :

gl_FragColor = textureColor + textureColor1 + textureColor2;

textureColor2를 샘플링 한 텍스처가 바인딩되지 않았기 때문에 텍스처 뷰에 문제가 있습니다.

셰이더에서는 console.log 또는 다른 표준 디버깅 방법을 사용할 수 없습니다. 셰이더에 대해 자세히 알고 싶지만 멈춰 있습니다.

코드 :

...

precision mediump float;

varying vec2 vTextureCoord;
varying vec3 vLightWeighting;

uniform sampler2D uSampler;
uniform sampler2D uSampler1;
uniform sampler2D uSampler2;
uniform sampler2D uSampler3;
uniform sampler2D uSampler4;
uniform sampler2D uSampler5;
uniform sampler2D uSampler6;
uniform sampler2D uSampler7;
uniform sampler2D uSampler8;
uniform sampler2D uSampler9;
uniform sampler2D uSampler10;
uniform sampler2D uSampler11;
uniform sampler2D uSampler12;
uniform sampler2D uSampler13;


void main(void) {


vec4 textureColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));
vec4 textureColor1 = texture2D(uSampler1, vec2(vTextureCoord.s, vTextureCoord.t));
vec4 textureColor2 = texture2D(uSampler2, vec2(vTextureCoord.s, vTextureCoord.t));

// Need help here
gl_FragColor = textureColor + textureColor1 ;

//gl_FragColor = textureColor + textureColor1 + textureColor2;

// 업데이트 된 질문

    if (  ${numTextures} == 1)
        {
            gl_FragColor = textureColor;
        }
    else if (${numTextures} == 2)
        {
            gl_FragColor = textureColor + textureColor1;
        }
    else if (${numTextures} == 3)
        {
            gl_FragColor = textureColor + textureColor1 + textureColor2;
        }

// 지금은 단순 실용주의를 사용합니다.

//로드시 셰이더에 값을 전달합니다.

// 여전히 런타임에 셰이더를 업데이트 할 수 없습니다.

///////////////////////////////////////

// 이것은 그리기 함수의 세그먼트입니다.

for (var t=0;t<object.textures.length;t++) {

 eval( "  world.GL.gl.activeTexture(world.GL.gl.TEXTURE"+t+");  " )
    world.GL.gl.bindTexture(world.GL.gl.TEXTURE_2D, object.textures[t]);
    world.GL.gl.pixelStorei(world.GL.gl.UNPACK_FLIP_Y_WEBGL, false);
    world.GL.gl.texParameteri(world.GL.gl.TEXTURE_2D, world.GL.gl.TEXTURE_MAG_FILTER, world.GL.gl.NEAREST);
    world.GL.gl.texParameteri(world.GL.gl.TEXTURE_2D, world.GL.gl.TEXTURE_MIN_FILTER, world.GL.gl.NEAREST);
    world.GL.gl.texParameteri(world.GL.gl.TEXTURE_2D, world.GL.gl.TEXTURE_WRAP_S, world.GL.gl.CLAMP_TO_EDGE);
    world.GL.gl.texParameteri(world.GL.gl.TEXTURE_2D, world.GL.gl.TEXTURE_WRAP_T, world.GL.gl.CLAMP_TO_EDGE);
    // -- Allocate storage for the texture
    //world.GL.gl.texStorage2D(world.GL.gl.TEXTURE_2D, 1, world.GL.gl.RGB8, 512, 512);
    //world.GL.gl.texSubImage2D(world.GL.gl.TEXTURE_2D, 0, 0, 0, world.GL.gl.RGB, world.GL.gl.UNSIGNED_BYTE, image);
    //world.GL.gl.generateMipmap(world.GL.gl.TEXTURE_2D);
    world.GL.gl.uniform1i(object.shaderProgram.samplerUniform, t);

}

...

아마도 런타임에서 가장 좋은 방법은 object.textures 배열로 조작하는 것입니까?!

  • 드디어 :

    • 새 플래그로 셰이더 재정의
    • 셰이더 컴파일 새 재질이 업데이트되었습니다.
gman

무엇을 성취하려고합니까?

텍스처를 많이 사용 하는 일반적인 방법 이 기사 의 하단에 있는 텍스처 아틀라스 를 사용하는 것 입니다.

그렇지 않으면 텍스처가 셰이더에로드되었는지 감지 할 방법이 없습니다. 자신의 플래그를 전달해야합니다. 예를 들면

 uniform bool textureLoaded[NUM_TEXTURES];

또는

 uniform float textureMixAmount[NUM_TEXTURES];

실제로 14 개의 텍스처가 필요한 고유 한 작업을하고 있다는 사실을 알지 못하는 한 내가 당신이라면 텍스처 아틀라스를 사용하겠습니다.

셰이더를 즉석에서 생성하는 것도 일반적입니다. 거의 모든 게임 엔진이이 작업을 수행합니다. Three.js도 그렇게합니다. 따라서 텍스처를 켜고 끄는 대신 N 텍스처에 대한 셰이더를 생성하는 코드를 작성하십시오. 그런 다음 하나의 텍스처 만 있으면 1 개의 텍스처 셰이더를 생성하고, 2 개의 텍스처 셰이더를 생성하는 등의 작업을 수행합니다. 이는 14 개의 텍스처 셰이더를 사용하고 13 개의 텍스처를 끄려고하는 것보다 GPU에서 훨씬 더 효율적입니다.

예:

// note, I'm not recommending this shader, only showing some code
// that generates a shader

function generateShaderSrc(numTextures) {

  return `
    // shader for ${numTextures} textures
    precision mediump float;
    
    varying vec2 vTextureCoord;
    varying vec3 vLightWeighting;

    uniform sampler2D uSampler[${numTextures}];
    uniform float uMixAmount[${numTextures}];
    
    void main() {
      vec4 color = vec4(0);

      for (int i = 0; i < ${numTextures}; ++i) {
        vec4 texColor = texture2D(uSampler[i], vTextureCoord);
        color = mix(color, texColor, uMixAmount[i]);
      }
      
      gl_FragColor = color;
    }
  `;
}

log(generateShaderSrc(1));
log(generateShaderSrc(4));

function log(...args) {
  const elem = document.createElement("pre");
  elem.textContent = [...args].join(' ');
  document.body.appendChild(elem);
}

아주 간단한 예입니다. 실제 셰이더 생성기는 종종 훨씬 더 많은 문자열 조작을 수행합니다.

또한 WebGL 1.0은 8 개의 텍스처 단위 만 지원해야합니다. webglstats에 따르면 약 15 %의 장치가 8 개의 텍스처 단위 만 지원 하므로 사용자가 얼마나 많은 텍스처 단위를 가지고 있는지 확인하고 앱이 필요한 것보다 적 으면 앱이 작동하지 않을 것이라고 경고하고 싶을 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

셰이더 프로그램의 FBO 컬러 어태치먼트와 샘플러 2D로 동시에 사용되는 텍스처

분류에서Dev

배열을 텍스처에 저장하고 버텍스 셰이더의 텍스처를 올바르게 샘플링하는 방법은 무엇입니까?

분류에서Dev

셰이더 (webgl)를 사용하여 캔버스에 미러 효과

분류에서Dev

Elm의 WebGL 라이브러리에서 렌더 버퍼를 텍스처로 사용하는 방법

분류에서Dev

Vulkan에서 작동하도록 HLSL 셰이더를 수정하면 텍스처 / 샘플러를 분리해야합니까?

분류에서Dev

WebGL은 2D 스프라이트의 텍스처를 렌더링합니다. 나타나지 않음

분류에서Dev

Unity는 여러 텍스처 (배열)를 셰이더로 전달합니까?

분류에서Dev

GLSL 셰이더에서 여러 텍스처를 사용하면 텍스처가 덮어 쓰여집니다.

분류에서Dev

셰이더의 인덱스를 사용하여 데이터 텍스처에서 텍셀 참조

분류에서Dev

5 개 이상의 텍스처를 스플래 팅하는 텍스처

분류에서Dev

일부 픽셀이 조각 셰이더에서 잘못된 텍스처를 샘플링하는 이유는 무엇입니까?

분류에서Dev

텍스처 배열을 WebGL 셰이더 유니폼에 바인딩하는 방법은 무엇입니까?

분류에서Dev

OpenGLES에서 여러 개체의 여러 텍스처에 대한 조각 셰이더를 설정하는 방법은 무엇입니까?

분류에서Dev

평면 기하학 셰이더가 항상 threejs webgl 기하학 공간에서 카메라를 향하는 둥근 모서리 2d 스프라이트를 만드는 방법

분류에서Dev

LibGDX의 셰이더에 여러 텍스처 전달

분류에서Dev

텍스처를 감싸지 않는 샘플러

분류에서Dev

하나의 텍스처 배열을위한 다중 샘플러

분류에서Dev

셰이더에서 Unity의 텍스처를 병합하는 방법이 있습니까?

분류에서Dev

셰이더에서 Unity의 텍스처를 병합하는 방법이 있습니까?

분류에서Dev

cocos2d에서 하나의 셰이더를 공유하는 스프라이트에 다른 텍스처를 설정하는 방법

분류에서Dev

WebGL / three.js 조각 셰이더-알파 투명 색상으로 알파 투명 텍스처 오버레이

분류에서Dev

GLSL 셰이더를 통한 cessna.osg의 텍스처 매핑

분류에서Dev

qt 및 qglwidget을 사용하여 두 개의 텍스처를 OpenGL 셰이더에 전달하는 방법

분류에서Dev

WebGL에서 데이터 텍스처를 사용하는 방법

분류에서Dev

OpenGL : 하나의 변수로 여러 텍스처를 셰이더에 전달하려면 어떻게해야합니까?

분류에서Dev

두 개 이상의 타겟간에 mix ()를 사용하여 WebGL 셰이더에서 모핑

분류에서Dev

webgl 2d 서로 위에 두 개의 투명한 텍스처를 혼합

분류에서Dev

깊이 텍스처에서 샘플링하면 항상 0

분류에서Dev

터널 셰이더 (WebGL에서 OpenGL로 변환)-텍스처 좌표가 일치하지 않습니까?

Related 관련 기사

  1. 1

    셰이더 프로그램의 FBO 컬러 어태치먼트와 샘플러 2D로 동시에 사용되는 텍스처

  2. 2

    배열을 텍스처에 저장하고 버텍스 셰이더의 텍스처를 올바르게 샘플링하는 방법은 무엇입니까?

  3. 3

    셰이더 (webgl)를 사용하여 캔버스에 미러 효과

  4. 4

    Elm의 WebGL 라이브러리에서 렌더 버퍼를 텍스처로 사용하는 방법

  5. 5

    Vulkan에서 작동하도록 HLSL 셰이더를 수정하면 텍스처 / 샘플러를 분리해야합니까?

  6. 6

    WebGL은 2D 스프라이트의 텍스처를 렌더링합니다. 나타나지 않음

  7. 7

    Unity는 여러 텍스처 (배열)를 셰이더로 전달합니까?

  8. 8

    GLSL 셰이더에서 여러 텍스처를 사용하면 텍스처가 덮어 쓰여집니다.

  9. 9

    셰이더의 인덱스를 사용하여 데이터 텍스처에서 텍셀 참조

  10. 10

    5 개 이상의 텍스처를 스플래 팅하는 텍스처

  11. 11

    일부 픽셀이 조각 셰이더에서 잘못된 텍스처를 샘플링하는 이유는 무엇입니까?

  12. 12

    텍스처 배열을 WebGL 셰이더 유니폼에 바인딩하는 방법은 무엇입니까?

  13. 13

    OpenGLES에서 여러 개체의 여러 텍스처에 대한 조각 셰이더를 설정하는 방법은 무엇입니까?

  14. 14

    평면 기하학 셰이더가 항상 threejs webgl 기하학 공간에서 카메라를 향하는 둥근 모서리 2d 스프라이트를 만드는 방법

  15. 15

    LibGDX의 셰이더에 여러 텍스처 전달

  16. 16

    텍스처를 감싸지 않는 샘플러

  17. 17

    하나의 텍스처 배열을위한 다중 샘플러

  18. 18

    셰이더에서 Unity의 텍스처를 병합하는 방법이 있습니까?

  19. 19

    셰이더에서 Unity의 텍스처를 병합하는 방법이 있습니까?

  20. 20

    cocos2d에서 하나의 셰이더를 공유하는 스프라이트에 다른 텍스처를 설정하는 방법

  21. 21

    WebGL / three.js 조각 셰이더-알파 투명 색상으로 알파 투명 텍스처 오버레이

  22. 22

    GLSL 셰이더를 통한 cessna.osg의 텍스처 매핑

  23. 23

    qt 및 qglwidget을 사용하여 두 개의 텍스처를 OpenGL 셰이더에 전달하는 방법

  24. 24

    WebGL에서 데이터 텍스처를 사용하는 방법

  25. 25

    OpenGL : 하나의 변수로 여러 텍스처를 셰이더에 전달하려면 어떻게해야합니까?

  26. 26

    두 개 이상의 타겟간에 mix ()를 사용하여 WebGL 셰이더에서 모핑

  27. 27

    webgl 2d 서로 위에 두 개의 투명한 텍스처를 혼합

  28. 28

    깊이 텍스처에서 샘플링하면 항상 0

  29. 29

    터널 셰이더 (WebGL에서 OpenGL로 변환)-텍스처 좌표가 일치하지 않습니까?

뜨겁다태그

보관