#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