Я думаю, что нам, возможно, потребуется увидеть еще немного кода, прежде чем мы сможем помочь вам выяснить точную проблему.Например, как выглядит ваш вершинный шейдер и как вы их связываете?
Между тем, я могу дать вам пару советов о шейдере, который вы опубликовали.С одной стороны, это не даст вам эффект, который вы описали.Что на самом деле произойдет, так это то, что он всегда будет показывать цвет текстуры или, если текстура не указана, отображать черный цвет.Цвет вершины никогда не будет показан.Это потому, что вы присваиваете последний цвет фрагмента дважды, при этом второе присваивание всегда переопределяет первое.
Возможно, вы захотите попробовать смешать два значения вместе путем добавления или умножения значений цвета и текстуры,Попробуйте что-то вроде этого:
gl_FragColor = vColor + texture2D(uSampler, vTextureCoord);
Единственная проблема в том, что если текстура пуста, вы все равно получите черный (все, что умножено на 0, все равно равно 0).Чтобы избежать этого, всегда используйте сплошную белую текстуру, если у вас нет фактической текстуры.
Если вы хотите точный эффект, который вы описали (вершинный цвет только при отсутствии текстуры), вам может понадобиться использовать условныйзаявление.Этого обычно лучше избегать, но я сомневаюсь, что ваше использование будет чем-то ужасно тяжелым.
Кроме того, в качестве подсказки стиля следующие строки эквивалентны:
vec2(vTextureCoord.s, vTextureCoord.t)
vTextureCoord.st
Вторая может быть быстрее,однако и должно быть предпочтительным.Помимо этого, однако, вы можете просто передать vTextureCoord
напрямую (как я показал), потому что это уже a vec2.