Для этого вам нужно трипланарное картирование. Принцип заключается в том, что вы проецируете текстуру на плоскость XZ, как вы это делали, но затем вы также проецируете ее на плоскости ZY и XY. Наконец, вы используете нормаль поверхности (обычно квадрат многократно), чтобы смешать текстуры (умножить и сложить).
Вот как выглядит функция смешивания:
inline float3 TriplanarBlendFactor(half3 normal) {
float3 bf = pow(abs(normal), 6);
bf /= dot(bf, (float3)1);
return bf;
}
Затем просто скомбинируйте образцы текстур следующим образом:
fixed4 cx = tex2D(tex, tx) * blendFactor.x;
fixed4 cy = tex2D(tex, ty) * blendFactor.y;
fixed4 cz = tex2D(tex, tz) * blendFactor.z;
fixed4 finalColor = cx + cy + cz;
Вы можете выставить мощность функции смешивания как шейдер свойство, если вы хотите контролировать расстояние смешивания.
Можно редко инициализировать массивы в C. Мне нравится использовать его для отображения интервала-> sometype для относительно плотных статических карт, где неотображенное значение может быть интерпретировано как 0:
int my_array[] = { [1] = 3, [4] = 2 };
printf("%d %d %d\n", sizeof my_array, my_array[0], my_array[1]);
/* prints 20, 0, 3 */
Синтаксически существует несколько вещей, которые Вы могли записать в C, который не скомпилирует в C++ (См. Несовместимости Между ISO C и ISO C++ для мучительных деталей.). Если Вы спрашиваете в более высоком уровне, если существует некоторая программа, которую возможно записать в C, но не возможное записать в C++, то ответ является "Нет".
C++ испытывает недостаток в C99 restrict
спецификатор. Поэтому нет никакого способа сказать компилятору выполнять оптимизацию, базирующуюся вокруг знания, что указатели не являются псевдонимами.
Существуют некоторые вещи, которые можно сказать в C, который Вы не можете в C++ (потому что C++ имеет более строгую проверку синтаксиса, и C имеет более обширный синтаксис 'прежней версии').
Кроме того, могут быть некоторые среды выполнения (O/S+library+compiler), которые поддерживают C, но не C++, таким образом, можно сделать C на тех платформах, где Вы не можете сделать C++.
int new = 0;
работы в C, но очевидно не может работать в C++, потому что 'новый' зарезервированное слово.
Существуют некоторые другие 'приемы' с зарезервированными словами, но кроме которого, можно в значительной степени сделать все в C, который можно сделать в C++.
В C можно создать литералы массивов ("соединяют литерал"), но в C++ Вы не можете
/* p points to the first element of an array of 4 int */
int *p = (int[]){1, 2, 3, 4};
Можно также создать массив с размером, еще не известным во время компиляции, но C++ не имеет такой возможности ("массив переменной длины"):
// create array. size is known at runtime only.
int p[rand() % 5 + 1];
... то есть все, что я могу сделать на C, но не на C ++.
Оба языка являются полными по Тьюрингу, поэтому теоретически вы можете создавать одинаково функциональные приложения на обоих.
OTOH, C ++ не является надмножеством C. В особенности C99 имеет некоторые функции, которых нет в C ++. Например. назначенные инициализаторы, массивы переменной длины в структурах и как автоматические переменные. В зависимости от вашего «чего угодно», это может быть то, что C ++ не может сделать, но C может.
Объявите переменную с именем 'class', например:
int class = 0;
Довольно много вещей. Например, на C вы можете написать такой код:
void * v = 0;
char * p = v;
и вы можете создавать такие массивы:
int main() {
int n = 42;
int a[n];
return 0;
}
ни один из них не будет компилироваться под C ++.
C++ не поддерживает названную членскую инициализацию структуры, в C можно сделать:
структура {интервал x, y;} = {.x = 3};
Можно также объединить это с функцией, показанной Matt Havener:
структура {интервал [3], b;} w [] = {[0].a = {1}, 1.a [0] = 2};
Короткий ответ... не, не действительно. См. http://www.research.att.com/~bs/bs_faq.html#difference
Можно сделать почти все на любом из языков программирования. Конечно, способ выразить это будет варьироваться, а также объем кода, ясность кода, простота дальнейшего обслуживания. Некоторые задачи могут быть кодированы с немногими строками в Прологе и немногими страницами кода в C++ и так далее.
Некоторыми ограничивающими факторами являются доступные библиотеки, доступные компиляторы и проблемы низкого уровня. Однако, когда Вы рассматриваете C и C++ на типичном ПК, затем нет никакого различия в вещах, которые могут быть сделаны в любом из них.
Если, конечно, Вы не просили различия между C, и C++ - для этих других людей дали Вам идею.
char *c = malloc(sizeof(char));
допустимо в C, не C++ т.е. автоматически кастинге void*
. Это, конечно - проблема синтаксиса, не так как, что Вы можете, и не может _do_ (т.е. выполните).
Это обращается к последнему стандарту C? Исходный C стандарт (ANSI 1989 или ISO 1990, с обновлениями 1995 года) справедливо близко к тому, чтобы быть подмножеством C++. Существуют различия, но они главным образом изобретены (самое большое исключение, вероятно, являющееся той пустотой *, преобразовывает свободно с любым указателем данных в C, но не в C++).
Однако новый стандарт C вышел в 1999, некоторое время после того, как я прекратил делать что-либо в самом современном C. Это имело новые возможности, некоторые из которых входят в стандарт C++, должный в этом году или затем, но не все.
В 'C' Вам не нужны предописания. Это позволяет Вам передавать параметры, которые интерпретируются неправильно. (Не то, чтобы это - замечательная особенность, но Вы не можете сделать этого в C++),
в файле A:
float sum(float a, float b)
{
return a+b;
}
в файле B
main()
{
printf("%f\n", sum(1,2));
}
с C это компилирует, но печатает 0.000
с C++ Вам нужен a float sum(float,float);
перед printf, и это дает ожидаемый результат.
Стандарт C ++ 1998 г. содержит список несовместимости со стандартом C 1990 г. длиной 13 страниц (Приложение C). Конечно, это немного по сравнению с количеством страниц, описывающих языки, но все же охватывает немного земли.
Краткое описание перечисленных различий:
sizeof ('a')
в C и C ++!) char * q = expr? "abc": "de";
) p = (void *) (struct x {int i;} *) 0;
) sizeof (0, arr)
для char arr [100];
) ... это были первые 3 страницы приложения C.
Если вы перейдете к 1999 году Стандарт C, на описание различий уйдет вечность. Хотя C ++ 0x действительно включает некоторые функции C99, многие из них просто несовместимы по своей сути, например, сложный тип.
«Если это невозможно сделать на ассемблере, этого не стоит делать!»
хорошо, если не считать юмора, Я ДУМАЮ ОП спрашивает синтаксически, а не оперативно.
Я думаю, что есть несколько непонятных вещей, которые разрешены в C (по крайней мере, C89), но которые недопустимы в C ++ или, по крайней мере, устарели ... Но (если они существуют) они довольно неясны. C ++ функционально является надмножеством C.
На самом деле, я могу вспомнить один пример:
Когда вы создаете библиотеку (файл .lib или файл .dll) для совместного использования другими приложениями, вам лучше использовать C вместо C ++, потому что результаты более переносимы. Вы можете сделать это в компиляторе C ++, используя блок extern «C».
В частности, у C ++ есть особенность, заключающаяся в отсутствии стандартного соглашения по изменению имен - для преобразования сигнатур функций вашей библиотеки в имена более низкого уровня, используемые компилятором. Так, например, если у вас есть функция типа int addNumbers (int a, int b), разные компиляторы C ++ могут переводить эту функцию на разные имена, что может привести к проблемам, когда вы захотите импортировать библиотеку. Если вы используете компилятор C или окружаете библиотеку, импортирующую и экспортирующую код, блоком C, вы не увидите этой проблемы, поскольку существует только один способ изменить имена функций в C.
Если критерием является решение конкретной проблемы программирования, то обе будут выполнять эту работу, хотя в некоторых случаях может быть немного проще сделать это на C ++ из-за более высокого уровня абстракции
Очевидно, что C ++ не является надмножеством C по очень простой причине: в C ++ были добавлены новые ключевые слова
class, virtual, new и т. д. и поэтому больше не могут использоваться в качестве идентификаторов в C ++.
Некоторые причины более тонкие.
Вы можете найти исчерпывающий ответ на этот вопрос на сайте Бьярна Страуструпа:
Язык программирования C ++ | Приложение B