OpenGL: Перевод текстур по координате z не дает никакого эффекта

#matlab #opengl #psychtoolbox

Вопрос:

Я нарисовал сетку шумовых текстур 10х10. Я хотел бы иметь возможность контролировать глубину каждой текстуры. В качестве теста я попытался перевести половину текстурированных объектов с координатой z в-.5, но, похоже, это не возымело никакого эффекта. Чего мне не хватает?

 glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glViewport(0, 0, RectWidth(winRect), RectHeight(winRect));
glMatrixMode(GL.PROJECTION);
glLoadIdentity;

glMatrixMode(GL.MODELVIEW);
glLoadIdentity;


glEnable(GL.TEXTURE_2D);


wall_texid = glGenTextures(1);
halfTextureSize = 128; % in px for meshgrid

%plaidData = makePlaidData(halfTextureSize);
%normalizedPlaidData = (plaidData - min(plaidData)) / ( max(plaidData) - min(plaidData) );

[x,y] = meshgrid(-halfTextureSize 1:halfTextureSize,-halfTextureSize 1:halfTextureSize);

noysSlope = 1.0; %1.5;
noys = 255.*oneoverf(noysSlope, size(x,1), size(x,2)); % oneoverf -> [0:1]
noys=repmat(noys,[ 1 1 3 ]);
noys=permute(uint8(noys),[ 3 2 1 ]);

xoffset = -10:1:10;
yoffset = -10:1:10;
rmin_bg = 45.6874;% pixels 
rmax_bg = 350.7631;% pixels  
rstrip = 11.6268;% this cuts a strip into the fixation disk that has a height the size of the paddle height
% this code pokes out the transparent aperture
opaque = ones(size(x'));

% for i = 1:length(xoffset)
%     opaque = min(opaque, ((sqrt((x' xoffset(i)).^2 (y' yoffset(i)).^2) >  rmax_bg)  |( sqrt((x' xoffset(i)).^2 (y' yoffset(i)).^2) <  rmin_bg)));
% end
% noys(4,:,:) = shiftdim(255 .* opaque, -1); 

glBindTexture(GL_TEXTURE_2D,  wall_texid);
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, halfTextureSize*2, halfTextureSize*2, 0, GL_RGB, GL_UNSIGNED_BYTE, noys);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

%glClear(GL.COLOR_BUFFER_BIT);
corners = [0 0;
    1 0;
    1 1;
    0 1
];

halfHeight = winRect(4)/2;
halfWidth  = winRect(3)/2;
canvas = .09; % pick the larger of the two dimensions, since they are not equal
depth = 0.0;
v=[-canvas -canvas depth;... 
    canvas -canvas depth;...
    canvas canvas  depth;...
    -canvas canvas depth]';

surroundTexture = glGenLists(1);
glNewList(surroundTexture, GL.COMPILE);
glBegin(GL.POLYGON);

for i = 1:4
    
    glTexCoord2dv(corners(i,:));
    glVertex3dv(v(:,i));
end

glEnd;

glEndList;



translations = struct('x',{},'y',{},'z',{});
index = 1;
offset = 0.1;
for y = -10:2:9
    for x = -10:2:9
        translation.x = x / 10.0   offset;
        translation.y = y / 10.0   offset;
        translations(index) = translation;
        index = index 1;
    end
end

    %%%Draw texture grid%%%%
    for i = 1:100
        glPushMatrix;
        if i < 51
             glTranslated(translations(i).x, translations(i).y, -.5);
        else
             glTranslated(translations(i).x, translations(i).y, 0.0);
        end
        glCallList(surroundTexture);
        glPopMatrix;
    end
 

NB: Я использую PsychToolBox, который предоставляет доступ к opengl в Matlab.

Комментарии:

1. Изменение значения координаты текстуры z при запросе 2D-текстуры не должно иметь никакого эффекта. Чего вы ожидаете, что произойдет?

2. Я решил, что, поскольку текстуры не имеют сторон, они фактически являются прямоугольниками, что я мог бы рисовать 2d-текстуры и переводить их по оси z в мире. Я думаю, это неправильно?

3. Ах, так вы говорите о перемещении объекта вдоль оси z? ModelView и матрица проекции являются матрицами идентичности, когда вы смотрите на четырехугольник спереди и с параллельной проекцией, нет разницы, насколько далеко находится объект. (если только это не находится за пределами пространства клипа).

4. Я полагал, что перемещение объектов вдоль оси z приведет к их удалению от камеры, что сделает их «меньше». Я использую неправильный тип проекции?

5. Вы вообще не используете какую-либо проекцию, вы устанавливаете матрицу проекции в матрицу идентичности. Если вам нужна перспективная проекция, вам нужно ее настроить. Например, С. gluPerspective