Отрисовка текстур в шейдерах

Версия Minecraft
1.7.10
1,015
9
102
У меня есть полигон, который рендрится с текстурой и с моим шейдером. Текстуру я накладываю вот так gl_FragColor = texture2D(img, gl_FragCoord.xy/resolution). resolution - это uniform vec2, разрешение окна майна. И получается, что текстура накладывается относительно экрана, но не относительно полигона. Как сделать так, что бы текстура накладывалась как при её бинде и без шейдера? Мне просто с пом. шейдера надо изменить цвет этой текстурой
 
2,505
81
397
Если это именно атрибут, то просто объяви его в обоих шейдерах. А если тебе нужно передать что-нибудь из вершинного в фрагментный, то зависит от версии шейдера. Можно использовать varying или in/out
 
1,015
9
102
Я откуда-то взял код, который работает
Vertex
C-like:
#version 410
layout(location = 0) in vec3 vertex;
layout(location = 1) in vec3 vertex_normal;
layout(location = 2) in vec2 texCoord;

out vec2 tCoord;

uniform mat4 modelview;
uniform mat4 projection;

void main() {
  gl_Position = projection * modelview * vec4(vertex, 1.0);
  tCoord = texCoord;
}

Fragment
C-like:
#version 410
in vec2 tCoord;

uniform sampler2D texture;

out vec4 color;

void main() {
  if(tCoord == vec2(0,0))
    color = vec4(1.0,0.0,0.0,1.0);
  else
    color = vec4(0.0,1.0,0.0,1.0);
    gl_FragColor = texture2D(texture, tCoord);
}

Я не знаю почему это работает. Я даже в uniform ничего не передавал. Получается оно само задается? Как определяется, что modelview это не projection? in/out вродь как догнал что это. А вот layout(location = 0) это что? Так же не догоняю что делает out vec4 color;. Если уберу, то перестанет рендрится

P.S. Ток заметил, что вылетает post render 1282: Invalid operation. Мб из-за ошибка всё работает?)
 
Последнее редактирование:

CumingSoon

Местный стендапер
1,634
12
269
Как определяется, что modelview это не projection
Ты когда значения передаешь, указываешь имя. Поэтому нереально перепутать, имея имя униформа
А вот uniform samplerХ Y; - особая строка. Биндить опять же нужно по имени и биндить нужно номер текстурного слота. По умолчанию нуль, который не на всех картах нужно грузить в шейдер. У тебя тоже нуль и не нужно париться с определением слота для семплера.
 
1,015
9
102
Сделал реверс инженеринг шейдеров ботании, и понял чё как. Вот, если кому понадобится, оставлю тут код
Vertex
C-like:
#version 120
varying vec2 texcoord;
varying vec4 color;

void main() {
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    texcoord = vec2(gl_MultiTexCoord0);
    color = gl_Color;
}

Fragment
C-like:
#version 120
varying vec2 texcoord;
varying vec4 color;
uniform sampler2D texture;

void main() {
    gl_FragColor = texture2D(texture, texcoord) * color;
}
 
1,990
18
105
реверс инженеринг
Спасибо, покричал.

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