2015-01-27 2 views
0

Я пытаюсь сопоставить координату мира с значением текстуры в шейдере фрагментов, используя триJS.координата карты мира по значению текстуры в фрагментном шейдере

Сгенерированный «цвет» только черный, но webgl не возвращает никаких ошибок.

Вот что я получаю:

  • в 3D, то, что я получаю в WebGL (черный кусочек вместо изображения)
  • в 2D холст, что я должен в WebGL.

enter image description here

Мои шейдеры:

<script id="vertShader" type="shader"> 

varying vec4 vPos; 

void main() { 
    vPos = modelViewMatrix * vec4(position, 1.0); 
    gl_Position = projectionMatrix * 
        modelViewMatrix * vec4(position, 1.0); 
} 
</script> 

<script id="fragShader" type="shader"> 

uniform mat4 rastoijk; 
uniform sampler2D ijk; 
uniform vec3 dimensionsIJK; 

varying vec4 vPos; 

void main(void) { 
    // get IJK coordinates of current element 
    vec4 ijkPos = rastoijk * vPos; 
    //convert IJK coordinates to texture coordinates 
    float sliceIndex = float(ijkPos[2])*(float(dimensionsIJK[0])*float(4))*float(dimensionsIJK[1]); 
    float rowIndex = ijkPos[1]*(dimensionsIJK[0]*float(4)); 
    float colIndex = ijkPos[0]*float(4); 
    vec2 textureCoordinates = vec2(colIndex, sliceIndex + rowIndex); 
    vec3 color = texture2D(ijk, textureCoordinates).rgb; 

    gl_FragColor = vec4(color, 1.0); 
    } 
</script> 

и соответствующая часть threeJS части:

var mat = new THREE.ShaderMaterial({ 
     uniforms: { 
      ijk: {type: 't', value: ijkRGBATex}, 
      dimensionsIJK: {type: 'v3', value: new THREE.Vector3(dimensions[0], dimensions[1], dimensions[2])}, 
      rastoijk: {type: 'm4', value: new THREE.Matrix4().set(rasijk[0], rasijk[4], rasijk[8], rasijk[12], 
             rasijk[1], rasijk[5], rasijk[9], rasijk[13], 
             rasijk[2], rasijk[6], rasijk[10], rasijk[14], 
             rasijk[3], rasijk[7], rasijk[11], rasijk[15])} 
     }, 
     vertexShader: document. 
         getElementById('vertShader').text, 
     fragmentShader: document. 
         getElementById('fragShader').text 
    }); 

и моя IJK текстура генерируется, как показано ниже:

ijkRGBATex = new THREE.DataTexture(_imageRGBA, _dims[0].length * 4, _dims[1]*_dims[2], THREE.RGBAFormat); 

где:

var _dims = [numberCols, numberRows, numberSlices]; 
var _imageRGBA = new Float32Array(_dims[2] *_dims[1] * _dims[0] * 4); 
    for(var i=0; i<_data.length; i++){ 
    _imageRGBA[4*i] = _imageRGBA[4*i + 1] = _imageRGBA[4*i + 2] = ((_data[i] - _min)/(_max - _min)); 
    _imageRGBA[4*i + 3] = 1; 
    } 

ли то, что я пытаюсь сделать, имеет смысл вообще? Я не ожидаю, что это будет правильно, но я не вижу белых пикселей в моей текстуре, что является наиболее проблематичным.

Бест,

+0

Я знаю, что это своего рода ленивый ответ, но проверил, правильно ли связан сэмплер? Вы можете попробовать использовать другую текстуру или фиксированную текстуру. что может вернуть вам нечерное значение (т. е. 0,5). –

+0

да, вы правы, проблема в том, что способ генерации текстуры должен быть правильным, но все же не удача (см. Правки) – Nicolas

+0

http://stackoverflow.com/questions/28188775/generate-texture-from-array- в-threejs – Nicolas

ответ

0

проблема в том, что текстуры мы пытаемся отобразить не является действительным. Новая тема создает об этой конкретной проблеме: generate texture from array in threejs

Смежные вопросы